Gohttp客户端教程展示了如何在Golang中使用net/http创建HTTP请求。http客户端发送HTTP请求并从由URL标识的资源接收HTTP响应。
$ go version go version go1.18.1 linux/amd64
我们使用Go版本1.18。
HTTP
超文本传输协议(HTTP)是分布式协作超媒体信息系统的应用协议。HTTP协议是万维网数据通信的基础。
去网/http
net/http
包包含创建HTTP客户端和服务器的工具。可以使用http.Get
、http.Post
、http.PostForm
和http.Head
轻松创建HTTP请求功能。
要设置HTTP设置,例如标头或重定向策略,我们按以下方式创建客户端:
client := &http.Client{ CheckRedirect: redirectPolicyFunc, } resp, err := client.Get("http://example.com")
响应主体必须在最后关闭:
defer resp.Body.Close()
Gohttp客户端状态码
HTTP响应状态代码指示特定HTTP请求是否已成功完成。响应分为五组:
- 信息响应(100-199)
- 成功响应(200-299)
- 重定向(300-399)
- 客户端错误(400-499)
- 服务器错误(500-599)
package main import ( "fmt" "log" "net/http" ) func main() { resp, err := http.Get("http://webcode.me") if err != nil { log.Fatal(err) } fmt.Println(resp.Status) fmt.Println(resp.StatusCode) }
该示例创建了一个对小型网站的GET请求。我们得到请求的状态码。
fmt.Println(resp.Status) fmt.Println(resp.StatusCode)
Status
以字符串形式给出状态,以数字形式给出StatusCode
。
去http客户端GET请求
以下示例在Go中创建一个简单的GET请求。
package main import ( "fmt" "io/ioutil" "log" "net/http" ) func main() { resp, err := http.Get("http://webcode.me") if err != nil { log.Fatal(err) } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(string(body)) }
我们向webcode.me
网页创建一个GET请求。
resp, err := http.Get("http://webcode.me")
使用Get
函数发出获取请求。
if err != nil { log.Fatal(err) }
我们检查错误。
defer resp.Body.Close()
客户端必须在完成后关闭响应主体。
body, err := ioutil.ReadAll(resp.Body)
我们使用ReadAll
读取正文的内容。
fmt.Println(string(body))
我们将接收到的数据打印到控制台。
$ go run get_req.go <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <link rel="stylesheet" href="format.css"> <title>My html page</title> </head> <body> ...
去http客户端HEAD请求
如果使用HTTPGET方法请求指定的资源,则HTTPHEAD方法请求返回的标头。
package main import ( "fmt" "log" "net/http" ) func main() { resp, err := http.Head("http://webcode.me") if err != nil { log.Fatal(err) } for k, v := range resp.Header { fmt.Printf("%s %s\n", k, v) } }
该示例使用http.Head
发出HEAD请求并打印响应标头的所有数据。
$ go run head_req.go Content-Length [394] Last-Modified [Sun, 23 Jan 2022 10:39:25 GMT] Connection [keep-alive] Etag ["61ed305d-18a"] Accept-Ranges [bytes] Server [nginx/1.6.2] Date [Mon, 14 Feb 2022 13:50:22 GMT] Content-Type [text/html]
用户代理头
User-Agent
请求标头是一个字符串,可让服务器和网络对等方识别请求用户代理的应用程序、操作系统、供应商和/或版本。
package main import ( "fmt" "io/ioutil" "log" "net/http" "time" ) func main() { c := http.Client{Timeout: time.Duration(3) * time.Second} req, err := http.NewRequest("GET", "http://webcode.me/ua.php", nil) if err != nil { log.Fatal(err) } req.Header.Add("User-Agent", "Go program") resp, err := c.Do(req) if err != nil { log.Fatal(err) } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(string(body)) }
该示例为其GET请求设置了一个User-Agent标头。请求的资源仅返回客户端的User-Agent字符串。
c := http.Client{Timeout: time.Duration(3) * time.Second}
我们创建超时为3秒的http客户端。
req, err := http.NewRequest("GET", "http://webcode.me/ua.php", nil)
使用http.NewRequest
创建一个新请求。
req.Header.Add("User-Agent", "Go program")
我们将User-Agent
标头添加到请求中。
$ go run user_agent.go Go program
去http.PostForm
HTTPPOST方法向服务器发送数据。
http.PostForm
向指定的URL发出POST,数据的键和值经过URL编码作为请求主体。Content-Type
标头设置为application/x-www-form-urlencoded
。
package main import ( "fmt" "io/ioutil" "log" "net/http" "net/url" ) func main() { resp, err := http.PostForm("https://httpbin.org/post", url.Values{"name": {"John Doe"}, "message": {"Hey!"}}) if err != nil { log.Fatal(err) } defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { log.Fatal(err) } fmt.Println(string(body)) }
在示例中,我们向https://httpbin.org/post网站发送POST请求,该网站是为开发者提供的在线测试服务。
$ go run post_form.go { "args": {}, "data": "", "files": {}, "form": { "message": "Hey!", "name": "John Doe" }, "headers": { "Accept-Encoding": "gzip", "Content-Length": "28", "Content-Type": "application/x-www-form-urlencoded", "Host": "httpbin.org", "User-Agent": "Go-http-client/2.0", "X-Amzn-Trace-Id": "Root=1-620a63eb-5b49f82c137a95e06bad94e3" }, "json": null, "origin": "188.167.250.179", "url": "https://httpbin.org/post" }
在本教程中,我们在Go中创建了GET和POST请求。
列出所有Go教程。