ตั้งแต่ปี 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. ...
voila คุณจะได้รับข้อมูลการตอบกลับในรายการที่แยกออกจากกันอย่างสะดวก
หมายเหตุด้านข้าง:
ด้วยcatch
ประโยคเราจับคลาสข้อยกเว้นรูท PHP ของห่วงโซ่การสืบทอด
\Exception
เนื่องจากข้อยกเว้นที่กำหนดเองของ Guzzle ขยาย
วิธีนี้อาจเป็นประโยชน์สำหรับกรณีการใช้งานที่ใช้ Guzzle ภายใต้ประทุนเช่นใน Laravel หรือ AWS API PHP SDK ดังนั้นคุณจึงไม่สามารถจับข้อยกเว้น Guzzle ของแท้ได้
ในกรณีนี้คลาสข้อยกเว้นอาจไม่ใช่คลาสที่กล่าวถึงในเอกสาร Guzzle (เช่น GuzzleHttp\Exception\RequestException
เป็นข้อยกเว้นรูทสำหรับ Guzzle)
ดังนั้นคุณต้องจับ \Exception
แทน แต่จำไว้ว่ามันยังคงเป็นอินสแตนซ์คลาสข้อยกเว้นของ Guzzle
แม้ว่าจะใช้ด้วยความระมัดระวัง เครื่องห่อเหล่านั้นอาจทำให้$e->getResponse()
ไม่สามารถใช้วิธีการแท้ของวัตถุGuzzle ได้ ในกรณีนี้คุณจะต้องดูซอร์สโค้ดข้อยกเว้นจริงของ Wrapper และค้นหาวิธีรับสถานะข้อความ ฯลฯ แทนที่จะใช้ Guzzle$response
วิธี 's
หากคุณโทรหา Guzzle โดยตรงด้วยตัวคุณเองคุณสามารถจับGuzzleHttp\Exception\RequestException
หรือคนอื่น ๆ ที่กล่าวถึงในเอกสารข้อยกเว้นของพวกเขาที่เกี่ยวกับเงื่อนไขกรณีการใช้งานของคุณ