本文將介紹一個 Golang 下的 Http 請求封裝庫。可以與 Python 的 requests 庫類似的配置請求和處理返回。
獲取 Goreq
go get -u github.com/zhshch2002/goreq
Quick start
首先,我們來發起一個 GET 請求,程式碼非常簡單。如下:
func main() {
res := goreq.Do(goreq.Get("https://httpbin.org/get"))
if res.Err != nil {
fmt.Println(res.Err)
} else {
fmt.Println(res.Text)
}
}
其中res
包含了相應的資料,res.Err
為非空時表示請求中遇到錯誤。
除了 GET,HTTP 還有其他一系列方法,包括 POST、PUT、DELETE、HEAD、OPTIONS。更換goreq.Get
為goreq.Post
即可。
func main() {
res := goreq.Post("https://httpbin.org/post").Do()
if res.Err != nil {
fmt.Println(res.Err)
} else {
fmt.Println(res.Text)
}
}
URL 引數
指在 UR?
L 之後用&
隔開的鍵值對資料。手工構建 URL 會比較麻煩,我們可以只用 Goreq 提供的鏈式函式來構建。
func main() {
res := goreq.Get("https://httpbin.org/get?hi=myself").
AddParam("aaa", "111"). // set a single param
AddParams(map[string]string{
"bbb": "222",
}).Do()
if res.Err != nil {
fmt.Println(res.Err)
} else {
fmt.Println(res.Text)
}
}
此時發出的請求的 URL 為https://httpbin.org/get?hi=myself&aaa=111&bbb=222
。Goreq 會自動編碼引數。
由此,我們可以發現 Gore 去對請求配置的方式——鏈式配置。比原始的 HTTP 庫提供的方式要快捷很多。
原始的引數構建方式。
req, err := http.NewRequest(http.MethodGet, "http://httpbin.org/get", nil)
if err != nil {
panic(err)
}
params := make(url.Values) // 引數在此出
params.Add("key1", "value1")
params.Add("key2", "value2")
req.URL.RawQuery = params.Encode()
r, err := http.DefaultClient.Do(req)
重新另起資料結構再轉化打斷了一開始的程式設計思路。
Goreq 配置請求
AddParam(k, v string)
添URL引數AddParams(v map[string]string)
新增一組URL引數AddHeader(key, value string)
新增請求頭部AddHeaders(v map[string]string)
新增一組請求頭部AddCookie(c *http.Cookie)
新增CookieSetUA(ua string)
設定UASetBasicAuth(username, password string)
設定HTTP身份驗證SetProxy(urladdr string)
為此請求設定代理SetTimeout(t time.Duration)
為此請求設定超時時間DisableRedirect()
禁用重定向跟隨SetCheckRedirect(fn func(req *http.Request, via []*http.Request) error)
為此請求設定重定向跟隨檢查函式- 設定POST資料
SetBody(b io.Reader)
SetRawBody(b []byte)
SetFormBody(v map[string]string)
SetJsonBody(v interface{})
SetMultipartBody(data ...interface{})
設定Multipart格式的資料
Callback(fn func(resp *Response)
設定一個在Do
方法呼叫完成之後執行的回撥函式
響應資料
func main() {
res := goreq.Post("https://httpbin.org/post").Do()
fmt.Println(res.Body) // []byte格式的資料
fmt.Println(res.Text) // 自動處理編碼後解析的字串
}
Goreq一開始是為了API和網頁請求設計的庫,會自動根據響應內容和響應頭推斷編碼型別,並自動解析為字串。
如果我們要處理JSON格式的響應資料,這樣寫可以更優雅。
func main() {
var data map[string]interface{}
err := goreq.Post("https://httpbin.org/post").Do().BindJSON(&data)
fmt.Println(data, err)
}
Goreq為響應res
提供了一些快速解析的方法,*goreq.Response
可以通過下述函式來獲取響應資料。
Resp() (*Response, error)
獲取響應本身以及網路請求錯誤。Txt() (string, error)
自動處理完編碼並解析為文字後的內容以及網路請求錯誤。HTML() (*goquery.Document, error)
XML() (*xmlpath.Node, error)
BindXML(i interface{}) error
JSON() (gjson.Result, error)
BindJSON(i interface{}) error
Error() error
網路請求錯誤。(正常情況下為nil
)
老爹說:還有一件事……
Goreq基本使用就是這樣,更完整的API請見GitHub。其中還包括自定義Client
和中介軟體的使用。
本作品採用《CC 協議》,轉載必須註明作者和本文連結