答案:http.Client 提供比顶层函数更灵活的 HTTP 请求控制,支持超时设置、自定义 Header、jsON 数据发送及连接复用。通过 NewRequest 构建请求,Do 发送,需关闭响应体;建议全局复用 Client 实例并配置 Transport 以提升性能。

在golang中,http.Client 是执行HTTP请求的核心类型之一。相比使用 http.Get 或 http.Post 这样的顶层函数,直接使用 http.Client 能提供更灵活的控制,比如设置超时、自定义Header、使用连接池等。
创建并使用基本的 http.Client
默认情况下,Go 提供了一个全局的 http.DefaultClient,但通常建议自己创建一个 http.Client 实例以便更好地控制行为。
以下是一个发起 GET 请求的基本示例:
client := &http.Client{} req, err := http.NewRequest("GET", "https://api.example.com/data", nil) if err != nil { log.Fatal(err) } <p>resp, err := client.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close()</p><p>body, _ := io.ReadAll(resp.Body) fmt.Println(string(body))</p>
说明: 使用 http.NewRequest 构造请求,再通过 client.Do 发送。记得调用 resp.Body.Close() 防止资源泄露。
立即学习“go语言免费学习笔记(深入)”;
设置请求超时
生产环境中必须设置超时,避免请求长时间挂起。
可以在创建 Client 时指定 Timeout:
client := &http.Client{ Timeout: 10 * time.Second, }
这个超时适用于整个请求周期(包括连接、写入、响应读取)。
添加自定义 Header
很多API需要认证或特定的Header信息,可以通过修改 Request 对象来实现:
req, _ := http.NewRequest("GET", "https://api.example.com/data", nil) req.Header.Set("Authorization", "Bearer your-token") req.Header.Set("User-Agent", "my-app/1.0")
Header 设置完成后,再传给 client.Do 执行。
发送 POST 请求(带json数据)
发送结构化数据(如 JSON)也很常见:
data := map[string]string{"name": "golang"} jsonData, _ := json.Marshal(data) <p>req, _ := http.NewRequest("POST", "<a href="https://www.php.cn/link/dc076eb055ef5f8a60a41b6195e9f329">https://www.php.cn/link/dc076eb055ef5f8a60a41b6195e9f329</a>", bytes.NewBuffer(jsonData)) req.Header.Set("Content-Type", "application/json")</p><p>client := &http.Client{Timeout: 5 * time.Second} resp, err := client.Do(req)</p>
注意设置 Content-Type 为 application/json,服务端才能正确解析。
复用 Client 和连接管理
http.Client 是并发安全的,可以被多个 goroutine 共享使用。建议在整个应用中只创建一次,重复使用。
还可以通过配置 Transport 来优化连接复用:
client := &http.Client{ Transport: &http.Transport{ MaxIdleConns: 100, MaxConnsPerHost: 50, IdleConnTimeout: 30 * time.Second, }, Timeout: 10 * time.Second, }
这样能有效提升高并发场景下的性能,减少 TCP 连接开销。
基本上就这些。掌握 http.Client 的使用,就能应对大多数网络请求场景。关键是理解其可配置性,避免每次请求都新建 Client,同时别忘了设超时和关闭 Body。


