截至2019年,这是我从上面的答案和Guzzle文档中阐述的内容,以处理异常,获取响应正文,状态代码,消息以及其他有时有价值的响应项目。
try {
/**
* We use Guzzle to make an HTTP request somewhere in the
* following theMethodMayThrowException().
*/
$result = theMethodMayThrowException();
} catch (\GuzzleHttp\Exception\RequestException $e) {
/**
* Here we actually catch the instance of GuzzleHttp\Psr7\Response
* (find it in ./vendor/guzzlehttp/psr7/src/Response.php) with all
* its own and its 'Message' trait's methods. See more explanations below.
*
* So you can have: HTTP status code, message, headers and body.
* Just check the exception object has the response before.
*/
if ($e->hasResponse()) {
$response = $e->getResponse();
var_dump($response->getStatusCode()); // HTTP status code;
var_dump($response->getReasonPhrase()); // Response message;
var_dump((string) $response->getBody()); // Body, normally it is JSON;
var_dump(json_decode((string) $response->getBody())); // Body as the decoded JSON;
var_dump($response->getHeaders()); // Headers array;
var_dump($response->hasHeader('Content-Type')); // Is the header presented?
var_dump($response->getHeader('Content-Type')[0]); // Concrete header value;
}
}
// process $result etc. ...
瞧 您可以在方便分隔的项目中获得响应的信息。
注意事项:
With catch
子句\Exception
随着Guzzle自定义异常对其的扩展,捕获了继承链PHP根异常类
。
对于在幕后使用Guzzle的用例(例如在Laravel或AWS API PHP SDK中)使用这种方法,因此您无法捕获真正的Guzzle异常,这种方法可能有用。
在这种情况下,异常类可能不是Guzzle文档中提到的那个(例如,GuzzleHttp\Exception\RequestException
作为Guzzle的根异常)。
因此,您必须抓住\Exception
它,但请记住,它仍然是Guzzle异常类实例。
虽然小心使用。这些包装器可能会使Guzzle $e->getResponse()
对象的真正方法不可用。在这种情况下,您必须查看包装程序的实际异常源代码,并找出如何获取状态,消息等,而不是使用Guzzle $response
的方法。
如果您自己直接致电Guzzle,则可以捕获GuzzleHttp\Exception\RequestException
或使用案例条件提及他们的例外文档中提到的其他任何人。