
Go标准库的http包在发起请求(如http.Get)时,默认添加User-Agent和Accept-Encoding两个请求头,分别为"Go-http-client/1.1"和"gzip",不包含其他隐式头字段。
go程序发起http请求时的默认请求头详解:go标准库的http包在发起请求(如http.get)时,默认添加user-agent和accept-encoding两个请求头,分别为"go-http-client/1.1"和"gzip",不包含其他隐式头字段。
在Go中,使用标准库 net/http 发起HTTP请求(例如调用 http.Get(url) 或 http.Post(url, contentType, body))时,客户端会自动设置一组最小化的默认请求头,仅包含以下两项:
- User-Agent: Go-http-client/1.1
- Accept-Encoding: gzip
这与Python的 urllib(发送 Python-urllib/3.x)或浏览器等客户端行为类似,但Go的设计更精简——它不会自动添加 Accept、Connection、Host、Content-Length 等常见头字段。其中:
- Host 头由 http.Transport 在请求发送前动态注入(基于URL.Host),不属于用户可见的“默认设置”;
- Content-Length(对非流式请求)由底层自动计算并添加;
- Accept 和 Connection 等头完全不会默认设置,需显式指定。
✅ 示例:观察默认头行为
package main
import (
"fmt"
"io"
"net/http"
)
func main() {
resp, err := http.Get("https://httpbin.org/headers")
if err != nil {
panic(err)
}
defer resp.Body.Close()
body, _ := io.ReadAll(resp.Body)
fmt.Println(string(body))
}该请求将返回类似如下JSON(精简):
{
"headers": {
"User-Agent": "Go-http-client/1.1",
"Accept-Encoding": "gzip",
"Host": "httpbin.org"
}
}注意:Host 由Go运行时填充,但不在你构造的 *http.Request 的 Header 映射中初始存在。
⚠️ 重要注意事项:
- 若需兼容特定API(如要求 User-Agent 非空但禁止默认值),务必手动覆盖:
req, _ := http.NewRequest("GET", url, nil) req.Header.Set("User-Agent", "MyApp/1.0") client := &http.Client{} resp, _ := client.Do(req) - Accept-Encoding: gzip 启用后,Go会自动解压响应体(若服务端返回 Content-Encoding: gzip),开发者无需手动处理压缩逻辑;
- 所有自定义头必须在调用 http.DefaultClient.Do() 或 http.Get() 之前 设置(http.Get 不提供修改头的入口,推荐使用 http.NewRequest + http.Client 模式以获得完全控制权)。
总之,Go的HTTP客户端秉持“显式优于隐式”原则,默认头极少,赋予开发者清晰、可预测的控制能力——这也是构建健壮API客户端的基础。


















