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