Golang 語(yǔ)言極簡(jiǎn) HTTP 客戶端 GoRequest
1介紹
GoRequest 是一個(gè)極簡(jiǎn)的 HTTP 客戶端,作者靈感來(lái)源于 Node.js 庫(kù) SuperAgent。相比 Golang 標(biāo)準(zhǔn)庫(kù) net/http,GoRequest 使用起來(lái)更加簡(jiǎn)單。GoRequest 官方的口號(hào)是 “像機(jī)槍一樣發(fā)送請(qǐng)求”。
GoRequest 包含以下功能:
- 支持 HTTP 請(qǐng)求方式:Get/Post/Put/Head/Delete/Patch/Options
- 支持設(shè)置 header 請(qǐng)求頭
- 支持使用 JSON 字符串作為請(qǐng)求參數(shù)
- 支持將多路請(qǐng)求的方式發(fā)送數(shù)據(jù)和文件
- 支持通過(guò)代理發(fā)送請(qǐng)求
- 支持為請(qǐng)求設(shè)置超時(shí)
- 支持 TLS 客戶端設(shè)置
- 支持設(shè)置重定向策略
- 支持為請(qǐng)求設(shè)置 cookie
- CookieJar - automatic in-memory cookiejar
- 支持請(qǐng)求頭設(shè)置基本身份認(rèn)證
安裝方式:
- go get github.com/parnurzeal/gorequest
2HTTP 請(qǐng)求方式
Golang 發(fā)送一個(gè)簡(jiǎn)單的 Get 請(qǐng)求,使用 net/http 標(biāo)準(zhǔn)庫(kù)和使用 GoRequst 庫(kù),兩種發(fā)送 Get 請(qǐng)求的方式都比較簡(jiǎn)單。
示例代碼如下:
標(biāo)準(zhǔn)庫(kù)方式:
- resp, err := http.Get("http://example.com/")
GoRequest 庫(kù)方式:
- request := gorequest.New()
- resp, body, errs := request.Get("http://example.com/").End()
或(該 GoRequest 方式無(wú)法復(fù)用對(duì)象)
- resp, body, errs := gorequest.New().Get("http://example.com/").End()
閱讀上面這兩段代碼,我們可以發(fā)現(xiàn),使用標(biāo)準(zhǔn)庫(kù)的方式發(fā)送 Get 請(qǐng)求,甚至比使用 GoRequest 庫(kù)的方式發(fā)送 Get 請(qǐng)求更加簡(jiǎn)單。
但是,當(dāng)我們需求稍作修改,比如我們需要為 Get 請(qǐng)求,設(shè)置 header 頭和設(shè)置重定向策略。我們?cè)賮?lái)看一下分別使用標(biāo)準(zhǔn)庫(kù)和 GoRequest 庫(kù)兩種實(shí)現(xiàn)方式。
標(biāo)準(zhǔn)庫(kù)方式:
- client := &http.Client{
- CheckRedirect: redirectPolicyFunc,
- }
- req, err := http.NewRequest("GET", "http://example.com", nil)
- req.Header.Add("If-None-Match", `W/"wyzzy"`)
- resp, err := client.Do(req)
GoRequest 庫(kù)方式(其它 HTTP 請(qǐng)求方式與 Get 使用方式相同):
- request := gorequest.New()
- resp, body, errs := request.Get("http://example.com").
- RedirectPolicy(redirectPolicyFunc).
- Set("If-None-Match", `W/"wyzzy"`).
- End()
閱讀上面兩段代碼,很容易發(fā)現(xiàn)使用 GoRequest 方式使實(shí)現(xiàn)更加簡(jiǎn)單。使用標(biāo)準(zhǔn)庫(kù)方式,首先需要?jiǎng)?chuàng)建一個(gè) Client,然后使用不同的命令設(shè)置 header 頭等操作,這僅僅是為了實(shí)現(xiàn)一個(gè) HTTP 請(qǐng)求。而使用 GoRequest 方式,僅需鏈?zhǔn)秸{(diào)用兩個(gè)方法即可輕松實(shí)現(xiàn)。
3JSON 格式請(qǐng)求參數(shù)
在 Golang 語(yǔ)言中,如果使用標(biāo)準(zhǔn)庫(kù) net/http 發(fā)送請(qǐng)求參數(shù)為 JSON 格式的 POST 請(qǐng)求,首先需要先將 map 或 struct 類型的數(shù)據(jù),使用標(biāo)準(zhǔn)庫(kù) encoding/json 的 Marshal 方法,將數(shù)據(jù)轉(zhuǎn)換為 JSON 格式的數(shù)據(jù),并且設(shè)置 header 頭參數(shù) Content-Type 的值為 application/json,然后創(chuàng)建一個(gè) Client,最終你的代碼變得越來(lái)越長(zhǎng),越來(lái)越難維護(hù)。
標(biāo)準(zhǔn)庫(kù)方式:
- m := map[string]interface{}{
- "name": "backy",
- "species": "dog",
- }
- mJson, _ := json.Marshal(m)
- contentReader := bytes.NewReader(mJson)
- req, _ := http.NewRequest("POST", "http://example.com", contentReader)
- req.Header.Set("Content-Type", "application/json")
- req.Header.Set("Notes","GoRequest is coming!")
- client := &http.Client{}
- resp, _ := client.Do(req)
如果使用 GoRequest 庫(kù)發(fā)送請(qǐng)求參數(shù)為 JSON 格式的 POST 請(qǐng)求,因?yàn)樗J(rèn)支持 JSON 格式的請(qǐng)求參數(shù),所以它只需要一行代碼就可以實(shí)現(xiàn)。
GoRequest 庫(kù)方式:
- request := gorequest.New()
- resp, body, errs := request.Post("http://example.com").
- Set("Notes","gorequst is coming!").
- Send(`{"name":"backy", "species":"dog"}`).
- End()
4支持回調(diào)函數(shù) Callback
GoRequest 庫(kù)還支持回調(diào)函數(shù),你可以根據(jù)自己的項(xiàng)目需求靈活使用它,回調(diào)函數(shù)示例代碼如下:
- func printStatus(resp gorequest.Response, body string, errs []error){
- fmt.Println(resp.Status)
- }
- gorequest.New().Get("http://example.com").End(printStatus)
5請(qǐng)求控制
在 Golang 項(xiàng)目開(kāi)發(fā)中,有時(shí)我們可能需要對(duì)請(qǐng)求做一些額外控制,比如超時(shí)處理,重試請(qǐng)求 N 次,重定向處理等。GoRequest 庫(kù)都可以為我們提供簡(jiǎn)單的實(shí)現(xiàn)方式。
超時(shí)處理:
- request := gorequest.New().Timeout(2*time.Millisecond)
- resp, body, errs:= request.Get("http://example.com").End()
需要注意的是,Timeout 是將 Dial 連接和 IO 讀寫的耗時(shí)總和,與時(shí)間參數(shù)作比較。
重試請(qǐng)求:
- request := gorequest.New()
- resp, body, errs := request.Get("http://example.com/").
- Retry(3, 5 * time.Second, http.StatusBadRequest, http.StatusInternalServerError).
- End()
閱讀上面這段代碼,它的含義是當(dāng)服務(wù)器返回結(jié)果是 http.StatusBadRequest 或 http.StatusInternalServerError 時(shí),會(huì)每隔 5 秒重試請(qǐng)求一次,共重試 3 次。
重定向處理:
- request := gorequest.New()
- resp, body, errs := request.Get("http://example.com/").
- RedirectPolicy(func(req Request, via []*Request) error {
- if req.URL.Scheme != "https" {
- return http.ErrUseLastResponse
- }
- }).
- End()
閱讀上面這段代碼,它的含義是將 http 請(qǐng)求重定向?yàn)?https 請(qǐng)求。
6返回結(jié)果處理方式
讀者朋友們可能已經(jīng)發(fā)現(xiàn),以上示例代碼都是以 End 結(jié)束,End 的含義是返回結(jié)果是字符串類型,如果我們希望返回結(jié)果是其他類型,比如字節(jié)類型和結(jié)構(gòu)體類型,可以將 End 分別替換為 EndBytes 和 EndStruct。
EndBytes 格式:
- resp, bodyBytes, errs := gorequest.New().Get("http://example.com/").EndBytes()
EndStruct 格式:
- heyYou struct {
- Hey string `json:"hey"`
- }
- var heyYou heyYou
- resp, _, errs := gorequest.New().Get("http://example.com/").EndStruct(&heyYou)
7總結(jié)
本文我們介紹 Golang 語(yǔ)言的極簡(jiǎn) HTTP 客戶端 GoRequest 以及它的使用方法。它比標(biāo)準(zhǔn)庫(kù) net/http 使用方式簡(jiǎn)單,當(dāng)我們項(xiàng)目開(kāi)發(fā)中需要使用 HTTP 方式調(diào)用接口時(shí),強(qiáng)烈推薦使用 GoRequest 庫(kù)。
GoRequest 底層在大多數(shù)用例中是基于 http.Client 實(shí)現(xiàn)的,所以通過(guò)一次調(diào)用 gorequest.New() 得到的對(duì)象,應(yīng)盡可能多次使用。
GoRequest 除了上面介紹的 JSON 參數(shù),它還支持 Struct 和 File,感興趣的讀者可以查閱官方文檔了解相關(guān)內(nèi)容。
本文轉(zhuǎn)載自微信公眾號(hào)「Golang語(yǔ)言開(kāi)發(fā)棧」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系Golang語(yǔ)言開(kāi)發(fā)棧公眾號(hào)。