===== http.Client =====
==== What is it? ====
`http.Client` is Go’s HTTP client used to send requests and receive responses.
It supports connection pooling and keep-alive by default.
==== What is it used for? ====
* Call external APIs (GET/POST/PUT/DELETE).
* Set timeouts and transport options.
* Reuse connections efficiently.
==== Quick example (GET) ====
package main
import (
"io"
"log"
"net/http"
"time"
)
func main() {
client := &http.Client{
Timeout: 5 * time.Second,
}
resp, err := client.Get("https://example.com")
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
b, _ := io.ReadAll(resp.Body)
log.Println("status:", resp.Status)
log.Println("body bytes:", len(b))
}
==== Example (custom request + headers) ====
package main
import (
"bytes"
"log"
"net/http"
"time"
)
func main() {
client := &http.Client{Timeout: 5 * time.Second}
req, _ := http.NewRequest("POST", "https://example.com/api", bytes.NewBufferString(`{"a":1}`))
req.Header.Set("Content-Type", "application/json")
resp, err := client.Do(req)
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
log.Println("status:", resp.StatusCode)
}
==== Notes / pitfalls (very important) ====
* Always `defer resp.Body.Close()` to avoid leaking connections.
* Prefer a reusable `http.Client` (do not create a new client per request in hot code).
* Set `Timeout` (or use request context) to avoid hanging forever.
* For advanced control, customize `Transport` (proxy, TLS settings, connection limits).
==== Related ====
* [[go:stdlib:http_client|HTTP client]]
* [[go:stdlib:net_http|net/http]]
* [[go:concurrency:context|context.Context]]
==== Hard words (English) ====
* **request** /rɪˈkwest/: yêu cầu
* **response** /rɪˈspɑːns/: phản hồi
* **connection pooling** /kəˈnekʃən ˈpuːlɪŋ/: gom/tái sử dụng kết nối
* **reuse** /ˌriːˈjuːz/: tái sử dụng
* **leak** /liːk/: rò rỉ (tài nguyên)
* **hang** /hæŋ/: treo, chờ mãi
* **transport** /ˈtrænspɔːrt/: tầng vận chuyển (cấu hình cách client kết nối)