Golang 中的 Restful API 请求客户端 resty 简介(类似 Java 中的 Jersey)

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

主要特点

  1. 简洁的 API

    • resty 提供了非常简洁的 API,支持链式调用,可以方便地构建复杂的 HTTP 请求。
    • 支持多种 HTTP 方法:GET、POST、PUT、DELETE、PATCH、HEAD、OPTIONS 等。
  2. 自动处理重定向

    • 默认情况下,resty 会自动处理 HTTP 重定向。
  3. 支持自定义请求头和查询参数

    • 可以方便地设置请求头、查询参数、表单数据、JSON 数据等。
  4. 支持多种响应处理

    • 可以直接处理响应体为字符串、JSON 对象、结构体等。
  5. 支持中间件

    • resty 支持中间件(Middleware),可以方便地扩展功能,例如日志记录、请求重试、超时处理等。
  6. 支持超时和重试机制

    • 可以设置请求超时时间,并且支持自动重试。
  7. 支持代理和自定义 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())
}
相关推荐
程序员码歌41 分钟前
【零代码AI编程实战】AI灯塔导航-总结篇
android·前端·后端
java坤坤1 小时前
GoLand 项目从 0 到 1:第八天 ——GORM 命名策略陷阱与 Go 项目启动慢问题攻坚
开发语言·后端·golang
元清加油1 小时前
【Golang】:函数和包
服务器·开发语言·网络·后端·网络协议·golang
bobz9652 小时前
GPT-4.1 对比 GPT-4o
后端
Java小白程序员2 小时前
Spring Framework :IoC 容器的原理与实践
java·后端·spring
小小愿望3 小时前
前端无法获取响应头(如 Content-Disposition)的原因与解决方案
前端·后端
追逐时光者4 小时前
C#/.NET/.NET Core技术前沿周刊 | 第 50 期(2025年8.11-8.17)
后端·.net
杨DaB4 小时前
【SpringBoot】Swagger 接口工具
java·spring boot·后端·restful·swagger
why技术4 小时前
也是震惊到我了!家里有密码锁的注意了,这真不是 BUG,是 feature。
后端·面试
桦说编程4 小时前
方法一定要有返回值 \ o /
java·后端·函数式编程