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())
}
相关推荐
吴佳浩5 小时前
Python入门指南(六) - 搭建你的第一个YOLO检测API
人工智能·后端·python
踏浪无痕6 小时前
JobFlow已开源:面向业务中台的轻量级分布式调度引擎 — 支持动态分片与延时队列
后端·架构·开源
Pitayafruit6 小时前
Spring AI 进阶之路05:集成 MCP 协议实现工具调用
spring boot·后端·llm
ss2736 小时前
线程池:任务队列、工作线程与生命周期管理
java·后端
不像程序员的程序媛6 小时前
Spring的cacheEvict
java·后端·spring
踏浪无痕7 小时前
JobFlow 实战:无锁调度是怎么做到的
后端·面试·架构
shoubepatien7 小时前
JAVA -- 11
java·后端·intellij-idea
喵个咪7 小时前
开箱即用的 GoWind Admin|风行,企业级前后端一体中后台框架:kratos-bootstrap 入门教程(类比 Spring Boot)
后端·微服务·go
uzong7 小时前
从大厂毕业后,到小公司当管理,十年互联网老兵的思维习惯阶段复盘
后端
追逐时光者7 小时前
一个 WPF 开源、免费的 SVG 图像查看控件
后端·.net