Go HTTP 调用(上)

时间:2022-12-14 11:29:26

耐心和持久胜过激烈和*。

哈喽大家好,我是陈明勇,今天分享的内容是 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​​ 参数如何设置,以及响应体的获取方法。