处理Guzzleexception并获取HTTP正文

当服务器返回4xx和5xx状态码时,我想处理Guzzle中的错误。 我提出这样的要求:

$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

根据文档 ,您可以捕获适当的exceptiontypes(4xx错误的ClientErrorResponseException ),并调用其getResponse()方法获取响应对象,然后调用getBody()

 use Guzzle\Http\Exception\ClientErrorResponseException; ... try { $response = $request->send(); } catch (ClientErrorResponseException $exception) { $responseBody = $exception->getResponse()->getBody(true); } 

truetrue传递给getBody函数,则表示您希望以stringforms获取响应正文。 否则,你会得到它作为Guzzle\Http\EntityBody类的实例。

Guzzle 6.x

根据文档 ,您可能需要捕获的exceptiontypes是:

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

虽然上面的答案是好的,但是他们不会处理networking错误,正如Mark提到的,BadResponseException只是ClientException和ServerException的一个超类。 但RequestException也是BadRequestException的超类。 这不仅会捕获400和500个错误,还会产生networking错误。 因此,假设您请求下面的页面,但是您的networking正在运行,并且您正在等待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); } }