詳解Go語言如何進(jìn)行Http調(diào)用
前言
無論是微服務(wù)還是單體架構(gòu)等,服務(wù)間都有相互通信的時(shí)候,而最直接的通信方法就是 HTTP
調(diào)用,本文將會介紹在 Go
語言里,如何進(jìn)行 HTTP
調(diào)用,并舉例說明。
前置知識
HTTP
調(diào)用需要通過 http
包里的 Client
結(jié)構(gòu)體里的 Do
方法去實(shí)現(xiàn),因此需要先聲明一個(gè) Client
結(jié)構(gòu)體變量,該結(jié)構(gòu)體可以設(shè)置超時(shí)時(shí)間等配置。
對于一個(gè)請求里的 URL
,查詢參數(shù),請求 method
等參數(shù),需要 http
包里的 Request
結(jié)構(gòu)體去封裝。我們可以通過 NewRequestWithContext
或 NewRequest
函數(shù)獲取一個(gè)基礎(chǔ)的 Request
結(jié)構(gòu)體指針變量。
NewRequestWithContext(ctx context.Context, method, url string, body io.Reader) (*Request, error)
- 參數(shù)
ctx
為Context
的接口類型,任意實(shí)現(xiàn)Context
接口的自定義類型都可以作為此參數(shù)傳遞。 - 參數(shù)
method
為HTTP
方法參數(shù),可選值有GET
、POST
、DELETE
、PUT
等。 - 參數(shù)
url
為接口的請求路徑。 - 參數(shù)
body
,為請求體參數(shù)。
通過 client.Do(req)
方法調(diào)用之后,返回值有 (*Response, error)
,第一個(gè)是響應(yīng)結(jié)構(gòu)體參數(shù),第二個(gè)是錯(cuò)誤參數(shù)。通過讀取 Response
的 body
的值,可以獲取接口的響應(yīng)體。
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"} }
- 需要攜帶查詢參數(shù)時(shí),可以直接拼接在
url
字符串上面。 header
參數(shù)可以通過 request 結(jié)構(gòu)體的Header
字段的set
方法或add
方法進(jìn)行設(shè)置。- HTTP 請求響應(yīng)碼可以通過
Response
的StatusCode
字段進(jìn)行查看。 - 接口請求成功之后,通過
io.ReadAll
方法,讀取resp.Body
響應(yīng)體信息。 - 除了直接在
url
上拼接query
參數(shù)的方式,我們還可以通過以下方式進(jìn)行添加query
參數(shù):
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
結(jié)構(gòu)體的 set
方法設(shè)置 query參數(shù),url
通過 url.Parse
函數(shù)生成一個(gè) URL
結(jié)構(gòu)體指針變量,rawUrl.RawQuery = params.Encode()
通過這行代碼將 query
參數(shù)和 url
進(jìn)行綁定,最后通過 String()
方法將 url
轉(zhuǎn)換成 string
類型。
小結(jié)
本文介紹了在 Go 語言里如何進(jìn)行 HTTP 調(diào)用,需要通過 http
包里的 Client
結(jié)構(gòu)體變量,調(diào)用其方法 Do
進(jìn)行 HTTP
調(diào)用,在 HTTP 調(diào)用前,需要通過 http 包里的 Request
結(jié)構(gòu)體封裝請求路徑和請求參數(shù)。最后通過 GET
請求案例講述了 query
參數(shù)和 header
參數(shù)如何設(shè)置,以及響應(yīng)體的獲取方法。
到此這篇關(guān)于詳解Go語言如何進(jìn)行Http調(diào)用的文章就介紹到這了,更多相關(guān)Go語言Http調(diào)用內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go?不支持?[]T轉(zhuǎn)換為[]interface類型詳解
這篇文章主要為大家介紹了Go不支持[]T轉(zhuǎn)換為[]interface類型詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-01-01go如何優(yōu)雅關(guān)閉Graceful?Shutdown服務(wù)
這篇文章主要為大家介紹了go優(yōu)雅關(guān)閉Graceful?Shutdown服務(wù)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-05-05Go語言學(xué)習(xí)教程之goroutine和通道的示例詳解
這篇文章主要通過A?Tour?of?Go中的例子進(jìn)行學(xué)習(xí),以此了解Go語言中的goroutine和通道,文中的示例代碼講解詳細(xì),感興趣的可以了解一下2022-09-09golang如何用type-switch判斷interface變量的實(shí)際存儲類型
這篇文章主要介紹了golang如何用type-switch判斷interface變量的實(shí)際存儲類型,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-04-04Go-Web框架中AOP方案的實(shí)現(xiàn)方式
本文主要介紹了Go-Web框架中AOP方案的實(shí)現(xiàn)方式,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06