如何使用Golang实现网络请求_Golang HTTP请求处理与解析

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

Go 语言内置的 net/http 包足够强大,无需第三方库就能完成绝大多数 HTTP 请求与响应处理。关键在于理解请求构造、响应读取、错误处理和常见格式(如 JSON、表单、文件)的解析逻辑。

发起基础 GET/POST 请求

使用 http.Gethttp.Post 是最简方式,适合无复杂头、无超时控制的场景:

  • http.Get("https://httpbin.org/get") 自动发送 GET,返回 *http.Responseerror
  • 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 解析:

  • 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.Bodyio.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。把这几处踩过坑,日常开发就稳了。