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教程。
