Go 语言 net/http 包可独立完成 HTTP 请求响应处理,关键在于正确构造请求、读取响应、处理错误及解析 JSON/表单/文件;需显式关闭 resp.Body、设置超时、慎用 Header.Add、检查状态码。

Go 语言内置的 net/http 包足够强大,无需第三方库就能完成绝大多数 HTTP 请求与响应处理。关键在于理解请求构造、响应读取、错误处理和常见格式(如 JSON、表单、文件)的解析逻辑。
发起基础 GET/POST 请求
使用 http.Get 或 http.Post 是最简方式,适合无复杂头、无超时控制的场景:
-
http.Get("https://httpbin.org/get")自动发送 GET,返回*http.Response和error -
http.Post("https://httpbin.org/post", "application/json", bytes.NewReader(data))需手动指定 Content-Type 和 body - 注意:响应体
resp.Body必须显式关闭(defer resp.Body.Close()),否则会泄漏连接
自定义客户端与精细控制
生产环境推荐用自定义 http.Client,便于设置超时、重试、代理、TLS 配置:
- 超时必须设:
client := &http.Client{Timeout: 10 * time.Second},避免请求无限挂起 - 复用连接靠默认的
http.DefaultClient.Transport(内部是&http.Transport{}),它自动复用 TCP 连接 - 若需忽略证书校验(仅测试用):
Transport.TLSClientConfig = &tls.Config{InsecureSkipVerify: true}
解析常见响应内容
拿到 resp.Body 后,按实际 Content-Type 解析:
立即学习“go语言免费学习笔记(深入)”;
- JSON:用
json.NewDecoder(resp.Body).Decode(&v),比ioutil.ReadAll+json.Unmarshal更省内存 - 表单数据(
application/x-www-form-urlencoded):resp.ParseForm()后通过resp.FormValue("key")取值 - 纯文本或 HTML:
io.ReadAll(resp.Body)得到字节切片,再转string() - 流式处理大响应:直接对
resp.Body做io.Copy或逐块读取(buf := make([]byte, 4096); n, _ := resp.Body.Read(buf))
构建并发送结构化请求(带 Header、Query、Body)
用 http.NewRequest 手动构造请求,灵活度最高:
- 添加查询参数:
u, _ := url.Parse("https://httpbin.org/get"); u.RawQuery = "name=go&age=5"; req, _ := http.NewRequest("GET", u.String(), nil) - 设置 Header:
req.Header.Set("Authorization", "Bearer xxx");注意不要用req.Header.Add重复设同一键 - 写入 JSON Body:
json.NewEncoder(req.Body).Encode(data),记得提前设req.Header.Set("Content-Type", "application/json") - 发送:
resp, err := client.Do(req)
基本上就这些。Golang 的 HTTP 处理不复杂但容易忽略细节——比如没关 Body、没设超时、误用 Header.Add、JSON 解析前忘了检查 status code。把这几处踩过坑,日常开发就稳了。










