Обработайте исключение Guzzle и получите тело HTTP
Я хотел бы обрабатывать ошибки от жрать, когда сервер возвращает 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. Как я могу получить тело ответа?
3 ответа:
жрать 3.x
на документы, вы можете поймать соответствующий тип исключения (
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
.
жрать 6.x
на документы, типы исключений, которые вам могут понадобиться, чтобы поймать:
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(); }
хотя ответы выше хороши, они не будут иметь дело с сетевыми ошибками, как отметил Марк 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); } }