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