Aucune des réponses (y compris celle acceptée par OP) ne satisfait réellement aux deux exigences:
- supprimer un avertissement (je prévois de lancer ma propre exception en cas d'échec)
- obtenir les informations d'erreur (au moins, le code de réponse) du flux
Voici ma prise:
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;
}
Cela entraînera une non- 200
réponse, mais vous pouvez facilement travailler à partir de là, par exemple ajouter une Response
classe simple et return new Response((int) $status, $response);
si cela correspond mieux à votre cas d'utilisation.
Par exemple, pour effectuer un JSON POST
sur un point de terminaison d'API:
$response = fetch(
"POST",
"http://example.com/",
json_encode([
"foo" => "bar",
]),
[
"Content-Type: application/json",
"X-API-Key: 123456789",
]
);
Notez l'utilisation de "ignore_errors" => true
dans la http
carte de contexte - cela empêchera la fonction de générer des erreurs pour les codes d'état non-2xx.
Il s'agit probablement de la "bonne" quantité de suppression d'erreurs pour la plupart des cas d'utilisation - je ne recommande pas d'utiliser l' @
opérateur de suppression d'erreurs, car cela supprimera également des erreurs telles que le simple passage de mauvais arguments, ce qui pourrait masquer par inadvertance un bogue dans code d'appel.
'ignore_errors' => TRUE
à$options
.