Go语言net/http包提供并发安全的HTTP客户端,核心是http.Client类型;基础GET用http.Get()但不支持超时,生产环境应自定义Client设置Timeout和Transport;POST需构造*http.Request并设置Content-Type;须分层检查err和StatusCode。

Go语言内置的net/http包提供了简洁、高效、并发安全的HTTP客户端能力,无需额外依赖即可发起GET、POST等常见请求。核心是http.Client类型,它封装了连接复用、超时控制、重定向、Cookie管理等逻辑,合理使用能显著提升稳定性和性能。
基础GET请求:最简方式
对于无特殊配置的简单GET请求,可直接调用http.Get()——它内部会复用默认的http.DefaultClient:
- 返回
*http.Response和error,需手动检查错误并关闭响应体(defer resp.Body.Close()) - 响应体是
io.ReadCloser,常用io.ReadAll()读取全部内容 - 注意:
http.Get()不支持设置超时,生产环境建议避免直接使用
自定义Client:控制超时与重试
创建显式的http.Client实例,可精细控制行为:
- 通过
Timeout字段设置整体请求超时(包括DNS解析、连接、写入、读取) - 使用
Transport定制底层传输,例如设置MaxIdleConns、MaxIdleConnsPerHost复用连接 - 如需重试逻辑,需自行实现(标准库不提供自动重试),通常在
Do()外层加for循环+错误判断
发送POST请求:表单与JSON都支持
POST本质是构造*http.Request后交由Client.Do()执行:
立即学习“go语言免费学习笔记(深入)”;
- 提交表单:用
url.Values{"key": {"value"}}.Encode()生成body,Header设为"Content-Type: application/x-www-form-urlencoded" - 提交JSON:用
json.Marshal()序列化结构体,Header设为"Content-Type: application/json" - 无论哪种,都要确保body是
io.Reader类型(如strings.NewReader(data)或bytes.NewReader(data))
处理响应与错误:别忽略细节
HTTP请求成功不代表业务成功,需分层检查:
- 先检查
err != nil(网络错误、DNS失败、TLS握手失败等) - 再检查
resp.StatusCode是否在2xx范围内(如resp.StatusCode >= 200 && resp.StatusCode ) - 响应头可通过
resp.Header.Get("Content-Type")获取,Body必须读完并关闭,否则连接无法复用 - 若服务返回非2xx但含有效数据(如400带错误详情),仍应读取Body解析内容
基本上就这些。Golang的HTTP Client设计克制而清晰,把复杂度留给使用者决策,而不是隐藏在黑盒里。用好它,关键在理解Client、Request、Response三者的职责边界,以及何时该定制、何时可默认。










