Я хотел бы обрабатывать ошибки от Guzzle, когда сервер возвращает коды состояния 4xx и 5xx. Я делаю запрос следующим образом:
$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. Как я могу получить тело ответа?
В документах вы можете поймать соответствующий тип исключения ( ClientErrorResponseException
для ошибок 4xx) и вызвать его метод getResponse()
для получения объекта ответа, а затем вызвать getBody()
:
use Guzzle\Http\Exception\ClientErrorResponseException; ... try { $response = $request->send(); } catch (ClientErrorResponseException $exception) { $responseBody = $exception->getResponse()->getBody(true); }
Передача true
функции getBody
означает, что вы хотите получить тело ответа как строку. В противном случае вы получите его как экземпляр класса Guzzle\Http\EntityBody
.
В документах , типы исключений, которые вам могут понадобиться поймать:
GuzzleHttp\Exception\ClientException
для 400-уровневых ошибок GuzzleHttp\Exception\ServerException
для 500-уровневых ошибок GuzzleHttp\Exception\BadResponseException
для обоих (это их суперкласс) Код для обработки таких ошибок теперь выглядит примерно так:
$client = new GuzzleHttp\Client; try { $client->get('http://google.com/nosuchpage'); } catch (GuzzleHttp\Exception\ClientException $e) { $response = $e->getResponse(); $responseBodyAsString = $response->getBody()->getContents(); }
Хотя ответы выше хорошо, они не будут иметь дело с сетевыми ошибками, поскольку 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); } }