Go 语言中的 http 包提供了创建 http 服务或者访问 http 服务所需要的能力,不需要额外的依赖。在这篇文章中,我们会介绍这些功能的使用,以及看一下 http 包的设计思路。

概览

http标准库的各个组成部分:

发送GET,HEAD,POST,POSTFORM请求:

1
2
3
4
5
resp, err := http.Get("http://example.com/")
...
resp, err := http.Post("http://example.com/upload", "image/jpeg", &buf)
...
resp, err := http.PostForm("http://example.com/form", url.Values{"key":{"Value"}, "id":{"123"}})

客户端必须在结束时关闭响应体。

1
2
3
4
5
6
7
resp, err := http.Get("http://example.com/")
if err != nil {
// handle err
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
// ...

可以配置客户端:

1
2
3
4
5
6
7
8
9
10
11
12
13
client := &http.Client{
CheckRedirect: redirectPolicyFunc,
}

resp, err := client.Get("http://example.com")
// ...

req, err := http.NewRequest("GET", "http://example.com", nil)
// ...

req.Header.Add("If-None-Match", `W/"wyzzy"`)
resp, err := client.Do(req)
// ...

为了控制代理,TLS配置,等配置,可以创建一个Transport:

1
2
3
4
5
6
7
tr := &http.Transport {
MaxIdleConns: 10,
IdleConnTimeout: 30 * time.Second,
DisableCompression: true,
}
client := &http.Client{Transport: tr}
resp, err := client.Get("http://example.com")

ListenAndServe函数使用给定的地址和处理函数开启一个HTTP服务器。handler通常是nil,意味着使用DefaultServeMux。

1
2
3
4
5
6
7
http.Handle("/foo", fooHandler)

http.HandleFunc("/bar", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello, %q", html.EscapeString(r.URL.Path))
})

log.Fatal(http.ListenAndServe(":8080", nil))

使用定制的服务器来控制服务器的行为

1
2
3
4
5
6
7
8
s := &http.Server {
Addr: ":8080",
Handler: myHandler,
ReadTimeout: 10 * time.Second,
WriteTimeout: 10 * time.Second,
MaxHeaderBytes: 1 << 20
}
log.Fatal(s.ListenAndServe())