开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第24天,点击查看活动详情
耐心和持久胜过激烈和狂热。
哈喽大家好,我是陈明勇,今天分享的内容是 Go HTTP 调用。如果本文对你有帮助,不妨点个赞,如果你是 Go 语言初学者,不妨点个关注,一起成长一起进步,如果本文有错误的地方,欢迎指出!
前言
上篇文章 Go HTTP 调用(上) 介绍了如何进行 HTTP 调用,并通过 GET 请求的例子,讲述了 query 参数和 header 参数如何设置,以及响应体的获取方法。 本文继上文,接下来会通过 POST 请求,对其他参数的设置进行介绍。
POST 请求
发起 HTTP POST 请求时,携带 json 格式的 body 参数是最常见的,这是因为 json 格式的参数可读性好,对于层级结构较为复杂的数据也能应对,并且这符合 RestFul API 的规范。因此以下的示例为:发送 HTTP POST 请求,并携带 json 类型的 body 参数。
import (
"bytes"
"context"
"encoding/json"
"fmt"
"io"
"net/http"
)
type User struct {
Username string `json:"username"`
Password string `json:"password"`
}
func main() {
client := http.Client{}
user := User{
Username: "123456",
Password: "12346",
}
dataByte, err := json.Marshal(user)
if err != nil {
fmt.Println(err)
}
bodyReader := bytes.NewReader(dataByte)
request, err := http.NewRequestWithContext(context.Background(), http.MethodPost, "http://localhost:8080/user", bodyReader)
if err != nil {
return
}
request.Header.Set("Content-Type", "application/json")
resp, err := client.Do(request)
if err != nil {
fmt.Println(err)
return
}
fmt.Println("statusCode: ", resp.StatusCode)
body, err := io.ReadAll(resp.Body)
if err != nil {
return
}
defer resp.Body.Close()
fmt.Println(string(body))
}
- 首先定义
User结构体,创建结构体变量 user,通过json.Marshal函数,将user转成[]byte数据,然后通过bytes.NewReader函数,将[]byte数据转成Reader指针变量。 http.NewRequestWithContext函数,最后一个参数是为body参数,接收的变量类型是Reader接口的实现体。第一步将user转成Reader指针变量就是为了在这里进行传递。- 传递
json类型的body参数,需要在请求头参数里设置Content-Type的值为application/json。 - 如果是发送
application/x-www-form-urlencoded类型的表单数据,需要改写body参数的生成代码:values := url.Values{} values.Set("username", "1234") values.Set("password", "1234") bodyReader := strings.NewReader(values.Encode())
小结
本文通过 POST 请求,介绍了如何传递 json 类型和 application/x-www-form-urlencoded 类型的 body 参数。对于 HTTP 中的 query 参数和 body 参数的如何传递,上下两篇文章已经通过例子进行介绍。虽然举的例子是 GET 和 POST 请求,如果想要调用 PUT、DELETE 等请求,只需要在 NewRequestWithContext 函数中,指定第二个参数为 http.MethodPut、http.MethodDelete 等就行。