リクエストとレスポンスのミドルウェア

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()