
go语言标准库的http包在发起请求(如http.get)时,默认添加user-agent和accept-encoding两个请求头,分别为"go-http-client/1.1"和"gzip",不包含其他隐式头字段。
go语言标准库的http包在发起请求(如http.get)时,默认添加user-agent和accept-encoding两个请求头,分别为"go-http-client/1.1"和"gzip",不包含其他隐式头字段。
在Go中使用标准库 net/http 发起HTTP请求时,其默认行为高度精简且可预测。例如,调用 http.Get("https://api.example.com") 会自动构造一个 *http.Request,并附带以下两个标准请求头:
User-Agent: Go-http-client/1.1 Accept-Encoding: gzip
其中:
- User-Agent 用于标识客户端身份,Go固定设为 Go-http-client/{version}(当前稳定版为 1.1,Go 1.22+ 已升级至 1.2,但语义兼容);
- Accept-Encoding: gzip 表示客户端支持Gzip压缩响应,http.Client 会自动解压(无需手动处理)。
⚠️ 注意:
- 无Referer、Cookie、Authorization等默认头:Go不会自动注入任何业务相关头字段;
- 无Host头?不,Host由Client自动设置:虽然未显式出现在req.Header中,但http.Transport会在发送前根据URL自动填充Host头(属于协议必需字段,非用户可控);
- 自定义头需显式设置:若需添加Authorization、Content-Type或覆盖User-Agent,必须通过http.NewRequest + req.Header.Set()实现:
req, _ := http.NewRequest("GET", "https://api.example.com", nil)
req.Header.Set("User-Agent", "MyApp/1.0")
req.Header.Set("Authorization", "Bearer token123")
client := &http.Client{}
resp, err := client.Do(req)
✅ 总结:Go的HTTP客户端遵循“最小默认原则”——仅提供协议合规所必需的最简头部,将控制权完全交予开发者,既保障安全性(避免意外泄露信息),又提升可预测性与调试友好性。实际开发中,应始终显式配置关键业务头字段,切勿依赖隐式行为。











