Gorequest的使用(类似python-requests)
Gorequest指南
gorequest为 golang 程序提供了极为简便的方式发起 HTTP 请求。网上关于这个库的中文教程不多,因此把官方的 README 文件翻译过来,结合自己的一些使用经验,希望能为各位 Gopher 提供一些帮助。
特性
- 支持发送Get/Post/Put/Head/Delete/Patch/Options 请求
- 建议的请求头设置
- JSON 支持:以 JSON 格式字符串作为函数参数的方式简化传输 JSON 的步骤。
- 分段支持:分段请求(Multipart Request)的方式发送数据或传输文件
- 代理:支援通过代理的方式发送请求。
- Timeout:为请求设置时间限制
- TLS(传输层安全协议)相关设定。
> TLSClientConfig - taking control over tls where at least you can disable security check for https - 重定向策略
- Cookie:为请求添加 cookie
- CookieJar - automatic in-memory cookiejar
- 基本的权限认证。
使用
1 | $ go get github.com/parnurzeal/gorequest |
使用 GoRequest 的理由?
通过 GoRequest 可以使工作变得更简单,使可以发起 HTTP 请求这件事更加优雅而充满乐趣。
不使用本库发起简单 GET 请求:
1 | resp, err := http.Get("http://example.com/") |
1、定义request请求
使用 GoRequest
1 | request := gorequest.New() |
如果你不想重用request
,也可以写成下面这样
1 | resp, body, errs := gorequest.New().Get("http://example.com/").End() |
2、设置Header
如果你需要设定 HTTP 头,设定重定向策略等,使用标准库会瞬间使事情变得异常复杂,在发起仅仅一个 GET 请求的过程,你就需要一个 Client
,通过一系列不同的命令来设定 HTTP 头(HTTP Headers
)。
1 | client := &http.Client{ |
现在,你有更加美妙的方式来完成这件事
1 | request := gorequest.New() |
发起 DELETE, HEAD, POST, PUT, PATCH 请求的过程和发起 GET 请求类似。
1 | request := gorequest.New() |
3、处理Json数据
用标准库发起 JSON POST ,你需要先将 map
或者 struct
格式的数据包装(Marshal)成 JSON 格式的数据,将头参数设定为’application/json’(必要时还要设定其他头),然后要新建一个http.CLient
变量。经过这一系列的步骤,你的代码变得冗长而难以维护
1 | m := map[string]interface{}{ |
至于 GoRequest, JSON 支持是必须的,所以,用这个库你只需要一行代码完成所有工作
1 | request := gorequest.New() |
另外,它同样支持结构体类型。所以,你可以在你的请求中发送不同的数据类型(So, you can have a fun Mix & Match sending the different data types for your request)。
1 | type BrowserVersionSupport struct { |
不仅支持 Send(),还支持 Query()
4、回调(Callback)
此外,GoRequest 支持回调函数,这让你可以更加灵活的使用这个库。
下面是回调函数的一个例子
1 | func printStatus(resp gorequest.Response, body string, errs []error){ |
5、Multipart/Form-Data
你可以将请求的内容类型设定为multipart
来以multipart/form-data
的方式发送所有数据。这个特性可以帮助你发送多个文件。
下面是一个例子
1 | gorequest.New().Post("http://example.com/"). |
如果感兴趣可以在文档中查看SendFile
函数部分获取更多。
6、代理(Proxy)
需要使用代理的时候,可以用 GoRequest Proxy Func 很好的处理。
1 | request := gorequest.New().Proxy("http://proxy:999") |
7、基本认证
添加基本的认证头信息
1 | request := gorequest.New().SetBasicAuth("username", "password") |
8、超时处理(Timeout)
与 time
库结合可以设置成任何的时间限制。
1 | request := gorequest.New().Timeout(2*time.Millisecond) |
Timeout
函数同时设定了连接和 IO 的时间限制。
9、以字节方式处理返回体(EndBytes)
当希望正文为字节时,我们现在可以使用 EndBytes。
回调的工作方式与 with 相同End
,除了使用字节数组而不是字符串。
1 | resp, bodyBytes, errs := gorequest.New().Get("http://example.com/").EndBytes() |
10、以结构体的方式处理返回体
假设 URL http://example.com/ 的返回体
{"hey":"you"}
。
1 | heyYou struct { |
11、连续重复请求(Retry)
假设你在得到 BadRequest 或服务器内部错误(InternalServerError)时进行连续三次,间隔五秒的连接尝试
1 | request := gorequest.New() |
12、处理重定向
可以使用 RedirectPolicy 处理重定向,其行为类似于 net/http 客户端的CheckRedirect 函数。只需指定一个函数,该函数接受即将发出的请求和先前请求的一部分,按最早的顺序排列。当此函数返回错误时,不会发出请求。
例如仅重定向到 https 端点:
1 | request := gorequest.New() |
13、跳过ssl证书检查
想跳过https的证书校验时用下面示例
1 | resp, body, errs := gorequest.New().TLSClientConfig(&tls.Config{ InsecureSkipVerify: true}). |