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())
}
相关推荐
欢乐少年19042 小时前
SpringBoot集成Sentry日志收集-3 (Spring Boot集成)
spring boot·后端·sentry
浪九天5 小时前
Java直通车系列13【Spring MVC】(Spring MVC常用注解)
java·后端·spring
uhakadotcom6 小时前
Apache CXF 中的拒绝服务漏洞 CVE-2025-23184 详解
后端·面试·github
uhakadotcom6 小时前
CVE-2025-25012:Kibana 原型污染漏洞解析与防护
后端·面试·github
uhakadotcom6 小时前
揭秘ESP32芯片的隐藏命令:潜在安全风险
后端·面试·github
uhakadotcom6 小时前
Apache Camel 漏洞 CVE-2025-27636 详解与修复
后端·面试·github
uhakadotcom6 小时前
OpenSSH CVE-2025-26466 漏洞解析与防御
后端·面试·github
uhakadotcom7 小时前
PostgreSQL的CVE-2025-1094漏洞解析:SQL注入与元命令执行
后端·面试·github
zhuyasen7 小时前
Go语言开发实战:app库实现多服务启动与关闭的优雅方案
后端·go
ITlinuxP7 小时前
2025最新Postman、Apipost和Apifox API 协议与工具选择方案解析
后端·测试工具·postman·开发工具·apipost·apifox·api协议