GoRequest http 客户端
最后更新于:2022-04-02 02:37:38
[TOC]
> [github](https://github.com/parnurzeal/gorequest)
## 安装
`go get github.com/parnurzeal/gorequest`
## 使用
### 简单 GET/POST/PUT ...
```
resp, body, errs := gorequest.New().Get("http://example.com/").End()
// PUT -> request.Put("http://example.com").End()
// DELETE -> request.Delete("http://example.com").End()
// HEAD -> request.Head("http://example.com").End()
// ANYTHING -> request.CustomMethod("TRACE", "http://example.com").End()
```
### get 带参数
```
gorequest.New().Post("http://127.0.0.1:8010/test.php").Query(send{
Name: "ads",
Age: 123,
}).End()
```
### post 表单提交
//主要通过控制type进行配合
```
//以表单形式提交,只能用multipart
_, s, errors := gorequest.New().Post("http://127.0.0.1:8010/test.php").Type("multipart").Send(send{
Name: "asd",
Age: 123,
}).End()
```
可多个 struct 一起发送
```
_, s, errors := agent.Post("http://127.0.0.1:8010/test.php").Type("multipart").Send(send2{
Age2: 123,
}).Send(send{
Name: "asd",
Age: 123,
}).End()
```
### 复杂 请求 (设置 header 等)
```
request := gorequest.New()
resp, body, errs := request.Get("http://example.com").
RedirectPolicy(redirectPolicyFunc).
Set("If-None-Match", `W/"wyzzy"`).
End()
```
## JSON
### json为字符串
```
request := gorequest.New()
resp, body, errs := request.Post("http://example.com").
Set("Notes","gorequst is coming!").
Send(`{"name":"backy", "species":"dog"}`).
End()
```
### json 为 结构体与字符串混用
```
type BrowserVersionSupport struct {
Chrome string
Firefox string
}
ver := BrowserVersionSupport{ Chrome: "37.0.2041.6", Firefox: "30.0" }
request := gorequest.New()
resp, body, errs := request.Post("http://version.com/update").
Send(ver).
Send(`{"Safari":"5.1.10"}`).
End()
```
## 回调函数
```
func printStatus(resp gorequest.Response, body string, errs []error){
fmt.Println(resp.Status)
}
gorequest.New().Get("http://example.com").End(printStatus)
```
## Multipart/Form-Data
### 发送文字
```
gorequest.New().Post("http://example.com/").
Type("multipart").
Send(`{"query1":"test"}`).
End()
```
### 发送文件
```
f, _ := filepath.Abs("./file2.txt")
bytesOfFile, _ := ioutil.ReadFile(f)
gorequest.New().Post("http://example.com/").
Type("multipart").
SendFile("./file1.txt").
SendFile(bytesOfFile, "file2.txt", "my_file_fieldname").
End()
```
## Basic Authentication
```
request := gorequest.New().SetBasicAuth("username", "password")
resp, body, errs := request.Get("http://example-proxy.com").End()
```
### 超时
```
request := gorequest.New().Timeout(2*time.Millisecond)
resp, body, errs:= request.Get("http://example.com").End()
```
### EndBytes / EndStruct 返回 Bytes或结构体
`resp, bodyBytes, errs := gorequest.New().Get("http://example.com/").EndBytes()
`
```
heyYou struct {
Hey string `json:"hey"`
}
var heyYou heyYou
resp, _, errs := gorequest.New().Get("http://example.com/").EndStruct(&heyYou)
```
## 重连多次,知道出现结果
```
request := gorequest.New()
resp, body, errs := request.Get("http://example.com/").
Retry(3, 5 * time.Second, http.StatusBadRequest, http.StatusInternalServerError).
End()
```
## 重定向
```
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()
```
当请求不是 https 是 取消发送
## Debug
通过环境变量设置
```
os.Setenv("GOREQUEST_DEBUG","0") // 0/1 开启/关闭
```
单个请求设置
```
var buf bytes.Buffer
logger := log.New(&buf, "[gorequest]", log.LstdFlags)
request := gorequest.New().SetDebug(true).SetLogger(logger)
```
';