如何在Golang中使用net/http处理HTTP请求_发送和接收数据

发布时间 - 2025-12-26 00:00:00    点击率:
Go中HTTP收发核心是服务端(http.ServeMux+ListenAndServe)与客户端(http.Client+NewRequest)分工:服务端用HandleFunc注册处理器,响应JSON等;客户端需自定义Client设超时,正确处理Body读写与关闭。

在 Go 中用 net/http 发送和接收 HTTP 数据非常直接,核心在于理解服务端(http.ServeMux + http.ListenAndServe)和客户端(http.Client + http.NewRequest)两种角色的分工。

接收请求:写一个简单的 HTTP 服务

服务端主要靠注册处理器函数来响应不同路径的请求。Go 内置的 http.HandleFunc 是最简方式:

  • 它自动帮你把路径和函数绑定,并处理底层连接、解析请求头/体等细节
  • 处理器函数签名固定为 func(http.ResponseWriter, *http.Request)
  • http.ResponseWriter 用于写响应状态码、头、正文;*http.Request 包含所有请求信息(URL、Method、Header、Body、Form 等)

示例:启动一个返回 JSON 的 /api/user 接口

package main

import ( "encoding/json" "net/http" )

type User struct { ID int json:"id" Name string json:"name" }

func userHandler(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json") json.NewEncoder(w).Encode(User{ID: 123, Name: "Alice"}) }

func main() { http.HandleFunc("/api/user", userHandler) http.ListenAndServe(":8080", nil) // 启动服务器 }

读取请求数据:表单、JSON、查询参数和原始 Body

根据前端传来的数据格式,选择对应方式解析:

  • 查询参数(URL 中 ?key=value):用 r.URL.Query().Get("key")r.FormValue("key")(后者会自动调用 ParseForm
  • 表单数据(application/x-www-form-urlencoded):先调用 r.ParseForm(),再用 r.PostFormValue("field")
  • JSON 请求体:用 json.NewDecoder(r.Body).Decode(&v),注意 r.Body 只能读一次,需提前检查 Content-Type
  • 原始字节流(如文件上传、自定义协议):用 io.ReadAll(r.Body),记得关闭或 defer r.Body.Close()

发送请求:用 http.Client 控制超时和重试

不要直接用 http.Get 这类快捷函数——它们用默认 client,无法设超时,容易阻塞。推荐显式创建带配置的 http.Client

  • 设置 Timeout 防止请求无限挂起(例如网络故障时)
  • 可选配 Transport 控制连接复用、TLS 设置、代理等
  • http.NewRequest 构造请求,手动设置 Header、Body(比如加 Authorization、发 JSON)

示例:POST 一个 JSON 到远程 API

client := &http.Client{
    Timeout: 5 * time.Second,
}
req, _ := http.NewRequest("POST", "https://api.example.com/data", strings.NewReader(`{"name":"Bob"}`))
req.Header.Set("Content-Type", "application/json")

resp, err := client.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()

body, _ := io.ReadAll(resp.Body) fmt.Printf("Status: %s, Body: %s", resp.Status, string(body))

常见陷阱与建议

  • http.Request.Bodyio.ReadCloser,必须 Close(),否则连接不释放,可能耗尽资源
  • http.Error(w, msg, code) 快速返回错误响应,比手动写状态码更安全
  • 避免在 handler 中启协程处理耗时任务后直接返回——要确保响应已写出,否则客户端收不到
  • 生产环境别用 nil 作为 http.ListenAndServe 的第二个参数,应传入自定义 http.ServeMuxhttp.Handler 方便测试和扩展


# js  # 前端  # json  # go  # golang  # 处理器  # app  # 字节  # ai  # 状态码  # Error  # 接口  # nil  # http  # 服务端  # 自定义  # 客户端  # 表单  # 两种  # 这类  # 第二个  # 你把  # 再用  # 绑定 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 制作企业网站建设方案,怎样建设一个公司网站?  IOS倒计时设置UIButton标题title的抖动问题  活动邀请函制作网站有哪些,活动邀请函文案?  如何在IIS中新建站点并配置端口与物理路径?  Laravel Telescope怎么调试_使用Laravel Telescope进行应用监控与调试  Android自定义控件实现温度旋转按钮效果  浅谈Javascript中的Label语句  学生网站制作软件,一个12岁的学生写小说,应该去什么样的网站?  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  高端云建站费用究竟需要多少预算?  使用PHP下载CSS文件中的所有图片【几行代码即可实现】  Laravel怎么在Controller之外的地方验证数据  如何实现javascript表单验证_正则表达式有哪些实用技巧  Laravel如何处理表单验证?(Requests代码示例)  如何挑选高效建站主机与优质域名?  Laravel怎么生成URL_Laravel路由命名与URL生成函数详解  Laravel如何使用Eloquent进行子查询  Laravel如何处理文件下载请求?(Response示例)  Bootstrap整体框架之CSS12栅格系统  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?  Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)  三星、SK海力士获美批准:可向中国出口芯片制造设备  Win11应用商店下载慢怎么办 Win11更改DNS提速下载【修复】  在Oracle关闭情况下如何修改spfile的参数  如何用好域名打造高点击率的自主建站?  如何用虚拟主机快速搭建网站?详细步骤解析  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法  音响网站制作视频教程,隆霸音响官方网站?  齐河建站公司:营销型网站建设与SEO优化双核驱动策略  大连 网站制作,大连天途有线官网?  公司网站制作价格怎么算,公司办个官网需要多少钱?  php结合redis实现高并发下的抢购、秒杀功能的实例  Laravel数据库迁移怎么用_Laravel Migration管理数据库结构的正确姿势  Laravel如何实现多级无限分类_Laravel递归模型关联与树状数据输出【方法】  如何生成腾讯云建站专用兑换码?  Windows10如何更改计算机工作组_Win10系统属性修改Workgroup  EditPlus中的正则表达式 实战(1)  UC浏览器如何切换小说阅读源_UC浏览器阅读源切换【方法】  Laravel如何连接多个数据库_Laravel多数据库连接配置与切换教程  长沙做网站要多少钱,长沙国安网络怎么样?  在线制作视频的网站有哪些,电脑如何制作视频短片?  Laravel怎么为数据库表字段添加索引以优化查询  如何在 Go 中优雅地映射具有动态字段的 JSON 对象到结构体  Java解压缩zip - 解压缩多个文件或文件夹实例  Laravel Admin后台管理框架推荐_Laravel快速开发后台工具  Linux虚拟化技术教程_KVMQEMU虚拟机安装与调优  如何在阿里云香港服务器快速搭建网站?  如何在香港服务器上快速搭建免备案网站?