ไม่มีคำตอบใด (รวมถึงคำตอบที่ OP ยอมรับ) ตรงตามข้อกำหนดสองข้อ:
- ระงับคำเตือน (ฉันวางแผนที่จะโยนข้อยกเว้นของตัวเองในกรณีที่ล้มเหลว)
- รับข้อมูลข้อผิดพลาด (อย่างน้อยรหัสตอบกลับ) จากสตรีม
นี่คือสิ่งที่ฉันทำ:
function fetch(string $method, string $url, string $body, array $headers = []) {
$context = stream_context_create([
"http" => [
"method" => $method,
"header" => implode("\r\n", $headers),
"content" => $body,
"ignore_errors" => true,
],
]);
$response = file_get_contents($url, false, $context);
$status_line = $http_response_header[0];
preg_match('{HTTP\/\S*\s(\d{3})}', $status_line, $match);
$status = $match[1];
if ($status !== "200") {
throw new RuntimeException("unexpected response status: {$status_line}\n" . $response);
}
return $response;
}
สิ่งนี้จะทำให้เกิดการไม่200ตอบสนอง แต่คุณสามารถทำงานจากที่นั่นได้อย่างง่ายดายเช่นเพิ่มResponseคลาสง่ายๆและreturn new Response((int) $status, $response);ถ้ามันเหมาะกับกรณีการใช้งานของคุณดีกว่า
ตัวอย่างเช่นในการทำ JSON POSTไปยังปลายทาง API:
$response = fetch(
"POST",
"http://example.com/",
json_encode([
"foo" => "bar",
]),
[
"Content-Type: application/json",
"X-API-Key: 123456789",
]
);
สังเกตการใช้"ignore_errors" => trueในhttpแผนที่บริบทซึ่งจะป้องกันไม่ให้ฟังก์ชันแสดงข้อผิดพลาดสำหรับรหัสสถานะที่ไม่ใช่ 2xx
นี่เป็นไปได้มากว่าจะเป็นการปราบปรามข้อผิดพลาดในปริมาณที่ "ถูกต้อง" สำหรับกรณีการใช้งานส่วนใหญ่ - ฉันไม่แนะนำให้ใช้ตัว@ดำเนินการป้องกันข้อผิดพลาดเนื่องจากจะระงับข้อผิดพลาดเช่นการส่งอาร์กิวเมนต์ที่ไม่ถูกต้องซึ่งอาจซ่อนข้อผิดพลาดโดยไม่ได้ตั้งใจ รหัสโทร.
'ignore_errors' => TRUE$options