处理 Guzzle 异常并获取 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 响应的正文。如何获取响应正文?

原文由 domos 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.1k
2 个回答

狂饮 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

原文由 sebbo 发布,翻译遵循 CC BY-SA 3.0 许可协议

异常应该是 BadResponseException 的一个实例,它有一个 getResponse 方法。然后,您可以将响应正文转换为字符串。参考: https ://github.com/guzzle/guzzle/issues/1105

 use GuzzleHttp\Exception\BadResponseException;

$url = $this->baseUrl . "subnet?section=$section";
try {
    $response = $this->client->get($url);
    $subnets = json_decode($response->getBody(), true);
    return $subnets['subnets'];
} catch (BadResponseException $ex) {
    $response = $ex->getResponse();
    $jsonBody = (string) $response->getBody();
    // do something with json string...
}

原文由 TheLastCodeBender 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题