Go 语言 net/http 包可独立完成 HTTP 请求响应处理,关键在于正确构造请求、读取响应、处理错误及解析 JSON/表单/文件;需显式关闭 resp.Body、设置超时、慎用 Header.Add、检查状态码。
Go 语言内置的 net/http 包足够强大,无需第三方库就能完成绝大多数 HTTP 请求与响应处理。关键在于理解请求构造、响应读取、错误处理和常见格式(如 JSON、表单、文件)的解析逻辑。
使用 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 和 bodyresp.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 解析:
json.NewDecoder(resp.Body).Decode(&v),比 ioutil.ReadAll + json.Unmarshal 更省内存application/x-www-form-urlencoded):resp.ParseForm() 后通过 resp.FormValue("key") 取值io.ReadAll(resp.Body) 得到字节切片,再转 string()
resp.Body 做 io.Copy 或逐块读取(buf := make([]byte, 4096); n, _ := resp.B
ody.Read(buf))用 http.NewRequest 手动构造请求,灵活度最高:
u, _ := url.Parse("https://httpbin.org/get"); u.RawQuery = "name=go&age=5"; req, _ := http.NewRequest("GET", u.String(), nil)
req.Header.Set("Authorization", "Bearer xxx");注意不要用 req.Header.Add 重复设同一键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。把这几处踩过坑,日常开发就稳了。