Обработайте исключение 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 69

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

}