[入門向]在Golang中像Python一樣快速使用HTTP請求

zhshch2002發表於2020-08-17

本文將介紹一個 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.Getgoreq.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)新增Cookie
  • SetUA(ua string)設定UA
  • SetBasicAuth(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 協議》,轉載必須註明作者和本文連結

相關文章