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 { } 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())
|