一架梯子,一头程序猿,仰望星空!
Go Resty教程 > 内容正文

Go Resty 高级配置


请求和响应中间件

Resty提供了中间件的能力,用于在请求之前,响应之后拦截请求,自定义处理逻辑操作请求和响应。这种方式比回调函数更为灵活。

// 创建一个Resty客户端
client := resty.New()

// 注册请求中间件
client.OnBeforeRequest(func(c *resty.Client, req *resty.Request) error {
    // 现在你可以访问客户端和当前请求对象
    // 可以根据需要进行操作

    return nil  // 如果成功则返回nil,否则返回错误
  })

// 注册响应中间件
client.OnAfterResponse(func(c *resty.Client, resp *resty.Response) error {
    // 现在你可以访问客户端和当前响应对象
    // 可以根据需要进行操作

    return nil  // 如果成功则返回nil,否则返回错误
  })

错误钩子

Resty提供了OnError钩子,它可能会被调用在以下情况下:

  • 客户端由于连接超时、TLS握手失败等原因无法发送请求
  • 请求已经重新尝试了最大次数,但仍然失败。

如果服务器有响应,原始错误将包装在*resty.ResponseError中,其中包含最后接收到的响应。

// 创建一个Resty客户端
client := resty.New()

client.OnError(func(req *resty.Request, err error) {
  if v, ok := err.(*resty.ResponseError); ok {
    // v.Response 包含服务器的最后一个响应
    // v.Err 包含原始错误
  }
  // 记录错误,增加指标等...
})

重定向策略

Resty提供了几种可用的重定向策略,并且支持多个策略同时使用。

// 创建一个Resty客户端
client := resty.New()

// 设置客户端的重定向策略。根据需要创建一个策略
client.SetRedirectPolicy(resty.FlexibleRedirectPolicy(15))

// 需要多个策略,例如重定向计数、域名检查等
client.SetRedirectPolicy(resty.FlexibleRedirectPolicy(20),
                        resty.DomainCheckRedirectPolicy("host1.com", "host2.org", "host3.net"))

自定义重定向策略

实现RedirectPolicy接口并将其注册到resty客户端。请查看redirect.go了解更多信息。

// 创建一个Resty客户端
client := resty.New()

// 使用原始函数到resty.SetRedirectPolicy
client.SetRedirectPolicy(resty.RedirectPolicyFunc(func(req *http.Request, via []*http.Request) error {
  // 在这里实现你的逻辑

  // 返回nil以继续重定向,否则返回错误以停止/阻止重定向
  return nil
}))

//---------------------------------------------------

// 使用结构体创建更灵活的重定向策略
type CustomRedirectPolicy struct {
  // 变量在这里定义
}

func (c *CustomRedirectPolicy) Apply(req *http.Request, via []*http.Request) error {
  // 在这里实现你的逻辑

  // 返回nil以继续重定向,否则返回错误以停止/阻止重定向
  return nil
}

// 在resty中注册
client.SetRedirectPolicy(CustomRedirectPolicy{/* 初始化变量 */})

代理设置

默认情况下,Go通过环境变量HTTP_PROXY来支持代理。Resty通过SetProxyRemoveProxy提供代理支持。根据需要进行选择。

客户端级别的代理设置将应用于所有请求。

// 创建一个Resty客户端
client := resty.New()

// 设置代理URL和端口
client.SetProxy("http://proxyserver:8888")

// 想要移除代理设置
client.RemoveProxy()