开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第23天,点击查看活动详情
耐心和持久胜过激烈和狂热。
哈喽大家好,我是陈明勇,今天分享的内容是 Go HTTP 调用。如果本文对你有帮助,不妨点个赞,如果你是 Go 语言初学者,不妨点个关注,一起成长一起进步,如果本文有错误的地方,欢迎指出!
前言
无论是微服务还是单体架构等,服务间都有相互通信的时候,而最直接的通信方法就是 HTTP 调用,本文将会介绍在 Go 语言里,如何进行 HTTP 调用,并举例说明。
前置知识
HTTP调用需要通过http包里的Client结构体里的Do方法去实现,因此需要先声明一个Client结构体变量,该结构体可以设置超时时间等配置。- 对于一个请求里的
URL,查询参数,请求method等参数,需要http包里的Request结构体去封装。我们可以通过NewRequestWithContext或NewRequest函数获取一个基础的Request结构体指针变量。NewRequestWithContext(ctx context.Context, method, url string, body io.Reader) (*Request, error)- 参数
ctx为Context的接口类型,任意实现Context接口的自定义类型都可以作为此参数传递。 - 参数
method为HTTP方法参数,可选值有GET、POST、DELETE、PUT等。 - 参数
url为接口的请求路径。 - 参数
body,为请求体参数。
- 参数
- 通过
client.Do(req)方法调用之后,返回值有(*Response, error),第一个是响应结构体参数,第二个是错误参数。通过读取Response的body的值,可以获取接口的响应体。
GET 请求
import (
"context"
"fmt"
"io"
"net/http"
)
func main() {
client := http.Client{}
request, err := http.NewRequestWithContext(context.Background(), http.MethodGet, "http://localhost:8080/user?name=tom", nil)
if err != nil {
return
}
request.Header.Set("headerParam", "header")
resp, err := client.Do(request)
if err != nil {
fmt.Println(err)
return
}
bytes, err := io.ReadAll(resp.Body)
if err != nil {
return
}
defer resp.Body.Close()
fmt.Println(string(bytes)) // {"code":0,"data":{"list":[{"name":"小明","age":20},{"name":"小红","age":18}]},"message":"success"}
}
- 需要携带查询参数时,可以直接拼接在
url字符串上面。 header参数可以通过 request 结构体的Header字段的set方法或add方法进行设置。- HTTP 请求响应码可以通过
Response的StatusCode字段进行查看。 - 接口请求成功之后,通过
io.ReadAll方法,读取resp.Body响应体信息。 - 除了直接在
url上拼接query参数的方式,我们还可以通过以下方式进行添加query参数:通过params := url.Values{} rawUrl, err := url.Parse("http://localhost:8080/user") if err != nil { return } params.Set("name", "tom") rawUrl.RawQuery = params.Encode() u := rawUrl.String()url.Values结构体的set方法设置 query参数,url通过url.Parse函数生成一个URL结构体指针变量,rawUrl.RawQuery = params.Encode()通过这行代码将query参数和url进行绑定,最后通过String()方法将url转换成string类型。
小结
本文介绍了在 Go 语言里如何进行 HTTP 调用,需要通过 http 包里的 Client 结构体变量,调用其方法 Do 进行 HTTP 调用,在 HTTP 调用前,需要通过 http 包里的 Request 结构体封装请求路径和请求参数。最后通过 GET 请求案例讲述了 query 参数和 header 参数如何设置,以及响应体的获取方法。