(OPによって受け入れられたものを含む)どの回答も実際には2つの要件を満たしていません。
- 警告を抑制します(失敗した場合に独自の例外をスローする予定です)
- ストリームからエラー情報(少なくとも応答コード)を取得します
これが私の見解です:
function fetch(string $method, string $url, string $body, array $headers = []) {
$context = stream_context_create([
"http" => [
// http://docs.php.net/manual/en/context.http.php
"method" => $method,
"header" => implode("\r\n", $headers),
"content" => $body,
"ignore_errors" => true,
],
]);
$response = file_get_contents($url, false, $context);
/**
* @var array $http_response_header materializes out of thin air
*/
$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);
それがユースケースに適している場合などです。
たとえばPOST
、APIエンドポイントに対してJSONを実行するには、次のようにします。
$response = fetch(
"POST",
"http://example.com/",
json_encode([
"foo" => "bar",
]),
[
"Content-Type: application/json",
"X-API-Key: 123456789",
]
);
"ignore_errors" => true
コンテキストマップでの使用に注意してください。http
これにより、関数が2xx以外のステータスコードに対してエラーをスローするのを防ぐことができます。
これは、ほとんどのユースケースで「適切な」量のエラー抑制である可能性が高いです。これにより@
、誤った引数を渡すなどのエラーも抑制され、誤ってバグが隠される可能性があるため、エラー抑制演算子を使用することはお勧めしません。呼び出しコード。