Nenhuma das respostas (incluindo a aceita pelo OP) realmente satisfaz os dois requisitos:
- suprimir um aviso (estou planejando lançar minha própria exceção em caso de falha)
- obter as informações de erro (pelo menos, o código de resposta) do fluxo
Aqui está minha opinião:
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;
}
Isso resultará em uma não 200
resposta, mas você pode facilmente trabalhar a partir daí, por exemplo, adicionar uma Response
classe simples e return new Response((int) $status, $response);
se isso se adequar melhor ao seu caso de uso.
Por exemplo, para fazer um JSON POST
para um endpoint de API:
$response = fetch(
"POST",
"http://example.com/",
json_encode([
"foo" => "bar",
]),
[
"Content-Type: application/json",
"X-API-Key: 123456789",
]
);
Observe o uso de "ignore_errors" => true
no http
mapa de contexto - isso evitará que a função lance erros para códigos de status não 2xx.
Esta é provavelmente a quantidade "certa" de supressão de erros para a maioria dos casos de uso - eu não recomendo usar o @
operador de supressão de erros, pois isso também suprime erros como simplesmente passar os argumentos errados, que poderiam inadvertidamente ocultar um bug no código de chamada.
'ignore_errors' => TRUE
a$options
.