【资料图】
耐心和持久胜过激烈和狂热。
哈喽大家好,我是陈明勇,今天分享的内容是 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
的值,可以获取接口的响应体。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
参数如何设置,以及响应体的获取方法。