Saltar al contenido

Manejar la excepción Guzzle y obtener el cuerpo HTTP

Solución:

Guzzle 6.x

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

  • GuzzleHttpExceptionClientException para errores de nivel 400
  • GuzzleHttpExceptionServerException para errores de nivel 500
  • GuzzleHttpExceptionBadResponseException para ambos (es su superclase)

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

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

Guzzle 3.x

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

use GuzzleHttpExceptionClientErrorResponseException;

...

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

Paso true al getBody La función indica que desea obtener el cuerpo de la respuesta como una cadena. De lo contrario, lo obtendrás como instancia de clase. GuzzleHttpEntityBody.

Si bien las respuestas anteriores son buenas, no detectarán errores de red. Como mencionó Mark, BadResponseException es solo una superclase para ClientException y ServerException. Pero RequestException también es una superclase de BadResponseException. RequestException se lanzará no solo para errores 400 y 500, sino también para errores de red y redireccionamientos infinitos. Entonces, digamos que solicita la página a continuación, pero su red se está reproduciendo y su captura solo espera una BadResponseException. Bueno, tu aplicación arrojará un error.

En este caso, es mejor esperar RequestException y buscar 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);
  }

}
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : / /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *