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. ...
짜잔. 편리하게 구분 된 항목으로 응답 정보를 얻을 수 있습니다.
사이드 노트 :
함께 catch
절 우리는 상속 체인 PHP 루트 예외 클래스를 잡을
\Exception
목구멍 사용자 정의 예외를 확장한다.
이 접근 방식은 Guzzle이 Laravel 또는 AWS API PHP SDK와 같이 내부적으로 사용되는 사용 사례에 유용 할 수 있으므로 진정한 Guzzle 예외를 포착 할 수 없습니다.
이 경우 예외 클래스는 Guzzle 문서에 언급 된 클래스가 아닐 수 있습니다 (예 : Guzzle GuzzleHttp\Exception\RequestException
의 루트 예외).
따라서 \Exception
대신 잡아야 하지만 여전히 Guzzle 예외 클래스 인스턴스임을 명심해야합니다.
조심해서 사용하십시오. 이러한 래퍼로 인해 Guzzle $e->getResponse()
개체의 정품 메서드를 사용할 수 없게 될 수 있습니다. 이 경우, Guzzle $response
의 메소드 를 사용하는 대신 래퍼의 실제 예외 소스 코드를보고 상태, 메시지 등을 얻는 방법을 찾아야 합니다.
Guzzle을 직접 직접 호출하면 사용 사례 조건과 관련하여 예외 문서에GuzzleHttp\Exception\RequestException
언급 된 다른 것을 잡을 수 있습니다 .