Kể từ năm 2019, đây là những gì tôi đã xây dựng từ các câu trả lời ở trên và tài liệu Guzzle để xử lý ngoại lệ, lấy nội dung phản hồi, mã trạng thái, tin nhắn và các mục phản hồi đôi khi có giá trị khác.
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. ...
Thì đấy. Bạn nhận được thông tin của phản hồi trong các mục được phân tách thuận tiện.
Ghi chú phụ:
Với catch
mệnh đề, chúng ta bắt lớp ngoại lệ gốc PHP chuỗi kế thừa
\Exception
vì các ngoại lệ tùy chỉnh Guzzle mở rộng nó.
Cách tiếp cận này có thể hữu ích cho các trường hợp sử dụng trong đó Guzzle được sử dụng ẩn như trong SDK PHP của Laravel hoặc AWS API, vì vậy bạn không thể bắt được ngoại lệ Guzzle chính hãng.
Trong trường hợp này, lớp ngoại lệ có thể không phải là lớp được đề cập trong tài liệu Guzzle (ví dụ GuzzleHttp\Exception\RequestException
như ngoại lệ gốc cho Guzzle).
Vì vậy, bạn phải bắt \Exception
thay thế nhưng hãy nhớ rằng nó vẫn là thể hiện của lớp ngoại lệ Guzzle.
Mặc dù sử dụng cẩn thận. Những trình bao bọc đó có thể làm cho $e->getResponse()
các phương thức chính hãng của đối tượng Guzzle không khả dụng. Trong trường hợp này, bạn sẽ phải xem mã nguồn ngoại lệ thực tế của trình bao bọc và tìm cách lấy trạng thái, thông báo, v.v. thay vì sử dụng $response
các phương pháp của Guzzle .
Nếu bạn tự mình gọi trực tiếp cho Guzzle, bạn có thể bắt gặp GuzzleHttp\Exception\RequestException
hoặc bất kỳ ai khác được đề cập trong tài liệu ngoại lệ của họ liên quan đến điều kiện trường hợp sử dụng của bạn.