前言
无论是微服务还是单体架构等,服务间都有相互通信的时候,而最直接的通信方法就是 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
参数如何设置,以及响应体的获取方法。
到此这篇关于详解Go语言如何进行Http调用的文章就介绍到这了,更多相关Go语言Http调用内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!