Guzzleの例外を処理し、HTTPボディを取得する

サーバーが4xxや5xxのステータスコードを返したときに、Guzzleからエラーを処理したいと思います。私はこのようなリクエストをします:

$client = $this->getGuzzleClient();
$request = $client->post($url, $headers, $value);
try {
    $response = $request->send();
    return $response->getBody();
} catch (\Exception $e) {
    // How can I get the response body?
}

$e->getMessage` はコード情報を返しますが、HTTP レスポンスのボディを返しません。どうすればレスポンスボディを取得できますか?

質問へのコメント (1)

ガズル 6.x

docs](http://docs.guzzlephp.org/en/latest/quickstart.html#exceptions)によると、キャッチする必要がありそうな例外の種類は以下の通りです

  • 400 レベルのエラーには GuzzleHttpExceptionClientException を使用します。
  • 500 レベルのエラーには GuzzleHttpException を使用します。
  • どちらも GuzzleHttpException }BadResponseException (スーパークラスです)

このようなエラーを処理するコードは、現在、次のようなものです:

$client = new GuzzleHttp\Client;
try {
    $client->get('http://google.com/nosuchpage');    
}
catch (GuzzleHttp\Exception\ClientException $e) {
    $response = $e->getResponse();
    $responseBodyAsString = $response->getBody()->getContents();
}
解説 (5)
ソリューション

ガズル 3.x

ドキュメント](http://guzzle3.readthedocs.org/http-client/request.html#http-errors)によると、適切な例外タイプ(4xxエラーの場合は ClientErrorResponseException )をキャッチして、その getResponse() メソッドを呼び出してレスポンスオブジェクトを取得し、その上で getBody() を呼び出すことができます:

use Guzzle\Http\Exception\ClientErrorResponseException;

...

try {
    $response = $request->send();
} catch (ClientErrorResponseException $exception) {
    $responseBody = $exception->getResponse()->getBody(true);
}

getBody][1]関数にtrueを渡すと、レスポンスボディを文字列として取得することができる。そうでない場合は、GuzzleHttpEntityBody`クラスのインスタンスとして取得されます。

解説 (0)

Markが言ったように、BadResponseExceptionはClientExceptionとServerExceptionのスーパークラスにすぎません。しかし、RequestExceptionもまた、BadRequestExceptionのスーパー・クラスです。これは400や500のエラーだけでなく、ネットワークエラーも捕らえることができます。例えば、下のようなページをリクエストしたけれども、ネットワークがうまくいかず、BadResponseExceptionをキャッチしたとします。この場合、アプリケーションはエラーを投げることになります。

この場合、RequestExceptionを想定し、レスポンスを確認する方がよいでしょう。

try {
  $client->get('http://123123123.com')
} catch (RequestException $e) {

  // If there are network errors, we need to ensure the application doesn't crash.
  // if $e->hasResponse is not null we can attempt to get the message
  // Otherwise, we'll just pass a network unavailable message.
  if ($e->hasResponse()) {
    $exception = (string) $e->getResponse()->getBody();
    $exception = json_decode($exception);
    return new JsonResponse($exception, $e->getCode());
  } else {
    return new JsonResponse($e->getMessage(), 503);
  }

}
解説 (0)

2019年の時点で、上記の回答とGuzzle docsから例外を処理し、応答本文、ステータスを取得するために詳しく説明しましたコード、メッセージ、その他の貴重な応答アイテム。


{を試してください。
    / **。
     * Guzzleを使用して、どこかでHTTPリクエストを行います。
     * MethodMayThrowException()に続く。
     * /。
    $ result = theMethodMayThorwException();。
}キャッチ(\ Exception $ e){。
    / **。
     *ここでは、実際にGuzzleHttp \ Psr7 \ Responseのインスタンスをキャッチします。
     *(それを見つけてください。 ./vendor/guzzlehttp/psr7/src/Response.php)すべて付き。
     *独自の「メッセージ」特性の方法。 以下の説明を参照してください。
     *。
     * HTTPステータスコード、メッセージ、ヘッダー、本文を使用できます。
     *例外オブジェクトが以前に応答を持っていることを確認してください。
     * /。
    if($ e-> hasResponse()){。
        $ response = $ e-> getResponse();。
        var_dump($ response-> getStatusCode()); // HTTPステータスコード。
        var_dump($ response-> getReasonPhrase()); //メッセージ。
        var_dump((string)$ response-> getBody()); //本体。
        var_dump($ response-> getHeaders()); //ヘッダー配列。
        var_dump($ response-> hasHeader( 'Content-Type')); //ヘッダーが表示されますか??
        var_dump($ response-> getHeader( 'Content-Type')[0]); //コンクリートヘッダー値。
    }。
}。
//プロセス$ resultなど. ...
``。

出来上がり。 便利な場所に分かれたアイテムで応答の情報を取得します。

**サイドノート:**。

`catch`句を使用すると、継承チェーンのPHPルート例外クラスをキャッチします。
「\ Exception」は、Guzzleのカスタム例外が拡張するためです。

このアプローチは、LaravelやAWS API PHP SDKのようにフードの下でGuzzleが使用されているため、本物のGuzzle例外を把握できない場合に役立ちます。

この場合、例外クラスは、Guzzleドキュメントで言及されているクラスではない場合があります(例:. `GuzzleHttp \ Exception \ RequestException`はGuzzleのルート例外です)。

したがって、代わりに「\ Exception」をキャッチする必要がありますが、それでもGuzzle例外クラスのインスタンスであることを覚えておいてください。

慎重に使用してください。 これらのラッパーは、Guzzle `$ e-> getResponse()`オブジェクトの本物のメソッドを利用できないようにする可能性があります。 この場合、ラッパーの実際の例外ソースコードを見て、ステータスやメッセージなどを取得する方法を見つける必要があります。 Guzzle `$ response`の方法を使用する代わりに。

自分で直接Guzzleを呼び出すと、 `GuzzleHttp \ Exception \ RequestException`または[例外docs](http://docs.guzzlephp.org/en/stable/quickstart.html#exceptions)で言及されている他のものをキャッチできます。ユースケースの条件に関して。
解説 (2)