Skip to content

http 客户端

URL = scheme + host + path + query
Header
Body
Method

Query

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=10

Body

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,
}