Обрабатывать исключение Guzzle и получать HTTP-теги

Я хотел бы обрабатывать ошибки от 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. Как я могу получить тело ответа?

Guzzle 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 .

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

Хотя ответы выше хорошо, они не будут иметь дело с сетевыми ошибками, поскольку 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); } }