http 客户端
URL = scheme + host + path + query
Header
Body
MethodQuery
go
params := url.Values{}
params.Set("page", "1")
params.Set("size", "10")
fullURL := "https://api.example.com/user?" + params.Encode()go
u, _ := url.Parse("https://api.example.com/user")
q := u.Query()
q.Set("page", "1")
q.Set("size", "10")
u.RawQuery = q.Encode() // page=1&size=10Body
go HTTP body 本质是 io.Reader
JSON
go
data := map[string]string{
"name": "tom",
}
b, _ := json.Marshal(data)
req, _ := http.NewRequest(
"POST",
url,
bytes.NewBuffer(b),
)
req.Header.Set("Content-Type", "application/json")form
go
data := url.Values{}
data.Set("name", "tom")
req, _ := http.NewRequest(
"POST",
url,
strings.NewReader(data.Encode()),
)
req.Header.Set("Content-Type", "application/x-www-form-urlencoded")multipart
go
var buf bytes.Buffer
writer := multipart.NewWriter(&buf)
fileWriter, _ := writer.CreateFormFile("file", "test.txt")
fileWriter.Write(fileBytes)
writer.Close()
req, _ := http.NewRequest("POST", url, &buf)
req.Header.Set("Content-Type", writer.FormDataContentType())发起请求
go
client := &http.Client{}
resp, err := client.Do(req)
defer resp.Body.Close()timeout
一定要设置 timeout,否则请求可能永远卡住
go
client := &http.Client{
Timeout: 5 * time.Second,
}