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": "[email protected]",
    }

    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())
}
相关推荐
地藏Kelvin7 分钟前
Spring Ai 从Demo到搭建套壳项目(二)实现deepseek+MCP client让高德生成昆明游玩4天攻略
人工智能·spring boot·后端
菠萝0142 分钟前
共识算法Raft系列(1)——什么是Raft?
c++·后端·算法·区块链·共识算法
长勺1 小时前
Spring中@Primary注解的作用与使用
java·后端·spring
小奏技术2 小时前
基于 Spring AI 和 MCP:用自然语言查询 RocketMQ 消息
后端·aigc·mcp
编程轨迹2 小时前
面试官:如何在 Java 中读取和解析 JSON 文件
后端
lanfufu2 小时前
记一次诡异的线上异常赋值排查:代码没错,结果不对
java·jvm·后端
编程轨迹2 小时前
如何在 Java 中实现 PDF 与 TIFF 格式互转
后端
编程轨迹2 小时前
面试官:你知道如何在 Java 中创建对话框吗
后端
编程轨迹2 小时前
深入理解 Java 中的信号机制
后端
夕颜1112 小时前
让 cursor 教我用 cursor 的隐藏技能
后端·trae