处理 Guzzle 异常并获取 HTTP 正文咕噜咕噜 6.x咕噜咕噜 3.x

2022-08-30 06:39:18

我想在服务器返回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 响应的正文。如何获取响应正文?


答案 1

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

答案 2

咕噜咕噜 3.x

根据文档,您可以捕获适当的异常类型(对于4xx错误)并调用其方法来获取响应对象,然后调用该对象:ClientErrorResponseExceptiongetResponse()getBody()

use Guzzle\Http\Exception\ClientErrorResponseException;

...

try {
    $response = $request->send();
} catch (ClientErrorResponseException $exception) {
    $responseBody = $exception->getResponse()->getBody(true);
}

传递给 getBody 函数表示您希望以字符串形式获取响应正文。否则,您将获得它作为类的实例。trueGuzzle\Http\EntityBody


推荐