7

信頼できない API ソースから結果を取得するために、Laravel 5.2 でいくつかのコードを作成しました。ただし、API 呼び出しは約 3 分の 1 の確率で 503 になるため、試行が失敗した場合にリクエストを自動的に再試行できる必要があります。

私はこれを行うために Guzzle を使用しており、503 応答を処理する前にインターセプトするコードを配置する場所を知っていると思います。しかし、実際にそこに何を書くべきかわかりません。

guzzle のドキュメントは再試行に関する限り多くを提供しておらず、私が遭遇した Guzzle 6 のすべての例は、結果を取得する方法のみを示しています (これは既に実行できます)。必要に応じてリクエストします。

私は決して誰かに私のために仕事をするように頼んでいるわけではありません - しかし、私はこれについての私の理解の限界に近づいていると思います. 誰かが私を正しい方向に向けることができれば、それは大歓迎です:)

編集:

がんばって見直します。次のコードを検討してください。その中で、通常は JSON 応答を生成する GET 要求を送信したいと考えています。

DataController.php

$client = new \GuzzleHttp\Client();
$request = $client->request('GET', 'https://httpbin.org/status/503'); // URI is for testing purposes

このリクエストからの応答が 503 の場合、ここでインターセプトできます。

Handler.php

public function render($request, Exception $e)
{
  if ($e->getCode() == 503)
  {
    // Code that would tell Guzzle to retry the request 5 times with a 10s delay before failing completely
  }

  return parent::render($request, $e);
}

それを置くのに最適な場所かどうかはわかりませんが、本当の問題は、if ($e->getCode() == 503)

4

2 に答える 2

3

2** 以外の応答が返された場合、Guzzle はデフォルトで例外をスローします。あなたの場合、503 応答が表示されます。例外は、アプリケーションが回復できるエラーと考えることができます。これが機能する方法はtry catchブロックです。

try {
    // The code that can throw an exception will go here
    throw new \Exception('A generic error');
    // code from here down won't be executed, because the exception was thrown.
} catch (\Exception $e) {
    // Handle the exception in the best manner possible.
}

tryブロックの部分に例外をスローできるコードをラップします。catch次に、ブロックの部分にエラー処理コードを追加します。PHPが例外を処理する方法の詳細については、上記のリンクを読むことができます。

あなたの場合、Guzzle 呼び出しをコントローラー内の独自のメソッドに移動します。

public function performLookUp($retryOnError = false)
{
    try {
        $client = new \GuzzleHttp\Client();
        $request = $client->request('GET', 'https://httpbin.org/status/503'); 
        return $request->send();
    } catch (\GuzzleHttp\Exception\BadResponseException $e) {
        if ($retryOnError) {
            return $this->performLookUp();
        }
        abort(503);
   }
}

これで、コントローラーで$this->performLookUp(true);.

于 2016-02-09T00:46:35.757 に答える