处理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); }
true
将true
传递给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); } }