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())
}
相关推荐
阳光是sunny8 小时前
LangGraph中的Reducer是什么
前端·人工智能·后端
灯澜忆梦8 小时前
GO_并发编程---定时器
开发语言·后端·golang
阳光是sunny8 小时前
从链到图:LangGraph 入门基础全解析
前端·人工智能·后端
皮皮林5519 小时前
开源实力派,给本地 AI 装上深度调研能力,一张 3090 跑到 95.7 分!
后端
努力的小雨9 小时前
把 Windows 桌面图标做成一个会自己运转的小世界
后端
武子康10 小时前
Search Console Platform Properties 扩大 SEO 资产边界:从 Page Ranking 到 Topic Coverage(5 类误读边界 + 3 表数据层设计)
前端·人工智能·后端
腾渊信息科技公司11 小时前
Spring Boot对接MES实战:视觉检测数据自动同步方案
java·人工智能·spring boot·后端·计算机视觉·ai·软件需求
IT_陈寒12 小时前
Vue这个特性差点让我加班到凌晨,谁懂啊
前端·人工智能·后端
段一凡-华北理工大学12 小时前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化
码事漫谈13 小时前
1999年的电商前夜和2026年的AI前夜 历史押韵但从不重复
后端