Tak satu pun dari jawaban (termasuk yang diterima oleh OP) yang benar-benar memenuhi dua persyaratan:
- menekan peringatan (saya berencana untuk membuang pengecualian saya sendiri jika terjadi kegagalan)
- dapatkan informasi kesalahan (setidaknya, kode respons) dari aliran
Ini pendapat saya:
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;
}
Ini akan memunculkan non- 200
respons, tetapi Anda dapat dengan mudah bekerja dari sana, misalnya menambahkan Response
kelas sederhana dan return new Response((int) $status, $response);
jika itu lebih sesuai dengan kasus penggunaan Anda.
Misalnya, untuk melakukan JSON POST
ke titik akhir API:
$response = fetch(
"POST",
"http://example.com/",
json_encode([
"foo" => "bar",
]),
[
"Content-Type: application/json",
"X-API-Key: 123456789",
]
);
Perhatikan penggunaan "ignore_errors" => true
dalam http
peta konteks - ini akan mencegah fungsi dari memberikan kesalahan untuk kode status non-2xx.
Ini kemungkinan besar adalah jumlah error-suppression yang "benar" untuk sebagian besar kasus penggunaan - Saya tidak merekomendasikan penggunaan @
operator error-suppression, karena ini juga akan menekan error seperti hanya menyampaikan argumen yang salah, yang dapat secara tidak sengaja menyembunyikan bug di kode panggilan.
'ignore_errors' => TRUE
untuk$options
.