resty
是一个简单、强大且功能丰富的 HTTP 和 REST 客户端库,用于 Go 语言。它提供了简洁的 API,支持多种 HTTP 方法(如 GET、POST、PUT、DELETE 等),并且可以方便地处理请求和响应。resty
的设计灵感来源于 Ruby 的 rest-client
,旨在为 Go 开发者提供一个简单易用的 HTTP 客户端工具。
安装
要使用 resty
,你需要先安装它。可以通过以下命令安装:
bash
go get github.com/go-resty/resty/v2
主要特点
-
简洁的 API
resty
提供了非常简洁的 API,支持链式调用,可以方便地构建复杂的 HTTP 请求。- 支持多种 HTTP 方法:GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS 等。
-
自动处理重定向
- 默认情况下,
resty
会自动处理 HTTP 重定向。
- 默认情况下,
-
支持自定义请求头和查询参数
- 可以方便地设置请求头、查询参数、表单数据、JSON 数据等。
-
支持多种响应处理
- 可以直接处理响应体为字符串、JSON 对象、结构体等。
-
支持中间件
resty
支持中间件(Middleware),可以方便地扩展功能,例如日志记录、请求重试、超时处理等。
-
支持超时和重试机制
- 可以设置请求超时时间,并且支持自动重试。
-
支持代理和自定义 HTTP 客户端
- 可以设置代理服务器,或者使用自定义的
http.Client
。
- 可以设置代理服务器,或者使用自定义的
基本用法
以下是一些常见的使用场景和示例代码。
1. 发送 GET 请求
go
package main
import (
"fmt"
"github.com/go-resty/resty/v2"
)
func main() {
client := resty.New()
resp, err := client.R().Get("https://httpbin.org/get")
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println("Status Code:", resp.StatusCode())
fmt.Println("Response Body:", resp.String())
}
2. 发送 POST 请求(JSON 数据)
go
package main
import (
"fmt"
"github.com/go-resty/resty/v2"
)
func main() {
client := resty.New()
data := map[string]interface{}{
"name": "John Doe",
"email": "john@example.com",
}
resp, err := client.R().
SetBody(data).
Post("https://httpbin.org/post")
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println("Status Code:", resp.StatusCode())
fmt.Println("Response Body:", resp.String())
}
3. 设置请求头和查询参数
go
package main
import (
"fmt"
"github.com/go-resty/resty/v2"
)
func main() {
client := resty.New()
resp, err := client.R().
SetHeader("Authorization", "Bearer your-token").
SetQueryParam("key1", "value1").
SetQueryParam("key2", "value2").
Get("https://httpbin.org/get")
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println("Status Code:", resp.StatusCode())
fmt.Println("Response Body:", resp.String())
}
4. 处理 JSON 响应
go
package main
import (
"fmt"
"github.com/go-resty/resty/v2"
)
type ResponseData struct {
Args struct {
Key1 string `json:"key1"`
Key2 string `json:"key2"`
} `json:"args"`
}
func main() {
client := resty.New()
var result ResponseData
resp, err := client.R().
SetResult(&result).
Get("https://httpbin.org/get?key1=value1&key2=value2")
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println("Status Code:", resp.StatusCode())
fmt.Println("Args.Key1:", result.Args.Key1)
fmt.Println("Args.Key2:", result.Args.Key2)
}
5. 自定义超时和重试
go
package main
import (
"fmt"
"github.com/go-resty/resty/v2"
"time"
)
func main() {
client := resty.New()
// 设置超时时间
client.SetTimeout(5 * time.Second)
// 设置重试策略
client.SetRetryCount(3)
client.SetRetryWaitTime(2 * time.Second)
client.SetRetryMaxWaitTime(10 * time.Second)
resp, err := client.R().Get("https://httpbin.org/delay/3")
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println("Status Code:", resp.StatusCode())
fmt.Println("Response Body:", resp.String())
}
6. 使用中间件
resty
支持中间件,可以方便地扩展功能。例如,可以添加日志中间件:
go
package main
import (
"fmt"
"github.com/go-resty/resty/v2"
"log"
)
func main() {
client := resty.New()
client.SetLogger(log.Default())
// 添加日志中间件
client.OnBeforeRequest(func(c *resty.Client, req *resty.Request) error {
log.Printf("Sending request to: %s", req.URL)
return nil
})
client.OnAfterResponse(func(c *resty.Client, resp *resty.Response) error {
log.Printf("Received response with status code: %d", resp.StatusCode())
return nil
})
resp, err := client.R().Get("https://httpbin.org/get")
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println("Status Code:", resp.StatusCode())
fmt.Println("Response Body:", resp.String())
}
高级用法
1. 使用自定义 HTTP 客户端
resty
支持使用自定义的 http.Client
,可以方便地集成到现有的 HTTP 客户端配置中:
go
package main
import (
"fmt"
"github.com/go-resty/resty/v2"
"net/http"
"time"
)
func main() {
// 创建自定义的 http.Client
customClient := &http.Client{
Timeout: 10 * time.Second,
}
client := resty.New()
client.SetHTTPClient(customClient)
resp, err := client.R().Get("https://httpbin.org/get")
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println("Status Code:", resp.StatusCode())
fmt.Println("Response Body:", resp.String())
}
2. 使用代理服务器
resty
支持设置代理服务器:
go
package main
import (
"fmt"
"github.com/go-resty/resty/v2"
)
func main() {
client := resty.New()
client.SetProxy("http://your-proxy-server:port")
resp, err := client.R().Get("https://httpbin.org/get")
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Println("Status Code:", resp.StatusCode())
fmt.Println("Response Body:", resp.String())
}