guzzlehttp example debug php guzzle

php - example - Manejar la excepción Guzzle y obtener el cuerpo HTTP



guzzlehttp client example (3)

Me gustaría manejar los errores de Guzzle cuando el servidor devuelve los códigos de estado 4xx y 5xx. Hago una solicitud como esta:

$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 devuelve información del código, pero no el cuerpo de la respuesta HTTP. ¿Cómo puedo obtener el cuerpo de respuesta?


Guzzle 3.x

Según los documentos , puede capturar el tipo de excepción apropiado ( ClientErrorResponseException para errores 4xx) y llamar a su método getResponse() para obtener el objeto de respuesta, y luego llamar a getBody() sobre eso:

use Guzzle/Http/Exception/ClientErrorResponseException; ... try { $response = $request->send(); } catch (ClientErrorResponseException $exception) { $responseBody = $exception->getResponse()->getBody(true); }

getBody true a la función getBody indica que desea obtener el cuerpo de la respuesta como una cadena. De lo contrario, lo obtendrá como instancia de la clase Guzzle/Http/EntityBody .


Guzzle 6.x

Según los documentos , los tipos de excepción que puede necesitar capturar son:

  • GuzzleHttp/Exception/ClientException para errores de 400 niveles
  • GuzzleHttp/Exception/ServerException para GuzzleHttp/Exception/ServerException de 500 niveles
  • GuzzleHttp/Exception/BadResponseException para ambos (es su superclase)

El código para manejar tales errores ahora se ve así:

$client = new GuzzleHttp/Client; try { $client->get(''http://google.com/nosuchpage''); } catch (GuzzleHttp/Exception/ClientException $e) { $response = $e->getResponse(); $responseBodyAsString = $response->getBody()->getContents(); }


Si bien las respuestas anteriores son buenas, no se ocuparán de los errores de red. Como Mark mencionó, BadResponseException es solo una súper clase para ClientException y ServerException. Pero RequestException también es una súper clase de BadRequestException. Esto capturará no solo 400 y 500 errores sino también errores de red. Supongamos que solicita la página siguiente pero su red se está reproduciendo y su captura espera una BadResponseException. Bueno, tu aplicación arrojará un error.

En este caso, es mejor esperar RequestException y verificar una respuesta.

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); } }