Ich versuche, file_get_contents
zusammen mit stream_context_create
POST-Anfragen zu stellen. Mein bisheriger Code:
$options = array('http' => array(
'method' => 'POST',
'content' => $data,
'header' =>
"Content-Type: text/plain\r\n" .
"Content-Length: " . strlen($data) . "\r\n"
));
$context = stream_context_create($options);
$response = file_get_contents($url, false, $context);
Es funktioniert einwandfrei. Wenn jedoch ein HTTP-Fehler auftritt, wird eine Warnung ausgegeben:
file_get_contents(...): failed to open stream: HTTP request failed! HTTP/1.0 400 Bad Request
und gibt false zurück. Gibt es einen Weg zu:
- eine Warnung unterdrücken (ich plane, im Fehlerfall meine eigene Ausnahme auszulösen)
- Erhalten Sie die Fehlerinformationen (mindestens den Antwortcode) aus dem Stream
'ignore_errors' => TRUE
zu$options
.@
am Anfang der Zeile setzen.Keine der Antworten (einschließlich der von OP akzeptierten) erfüllt tatsächlich die beiden Anforderungen:
Hier ist meine Einstellung:
Dies führt zu einer Nichtantwort
200
, aber Sie können problemlos von dort aus arbeiten, z. B. eine einfacheResponse
Klasse hinzufügen undreturn new Response((int) $status, $response);
wenn dies besser zu Ihrem Anwendungsfall passt.So führen Sie einen JSON-Vorgang
POST
für einen API-Endpunkt aus:Beachten Sie die Verwendung
"ignore_errors" => true
in derhttp
Kontextzuordnung. Dadurch wird verhindert, dass die Funktion Fehler für Nicht-2xx-Statuscodes auslöst.Dies ist höchstwahrscheinlich die "richtige" Menge an Fehlerunterdrückung für die meisten Anwendungsfälle. Ich empfehle nicht, den
@
Operator zur Fehlerunterdrückung zu verwenden, da dies auch Fehler wie das Übergeben der falschen Argumente unterdrückt, die versehentlich einen Fehler verbergen könnten Code aufrufen.quelle
Hinzufügen einiger weiterer Zeilen zur akzeptierten Antwort, um den http-Code zu erhalten
Um die Fehlerausgabe auszublenden, sind beide Kommentare in Ordnung. ignore_errors = true oder @ (ich bevorzuge @)
quelle
@file_get_contents
undignore_errors = true
sind nicht dasselbe: der erste gibt nichts zurück; Die zweite Option unterdrückt Fehlermeldungen, gibt jedoch die Serverantwort zurück (z. B. 400 Bad Request).Ich benutze eine Funktion wie diese:
Es werden 200 (Ok) oder 400 (Bad Request) zurückgegeben.
Es funktioniert perfekt und ist einfacher als cURL.
quelle
status
- es hat keine Verbindung zum HTTP-Statuscode für den API-Aufruf$http_response_header[0]
eine hochgelobte Antwort nichtfile_get_contents
?Ich gehe auf diese Seite mit einem anderen Problem und poste meine Antwort. Mein Problem war, dass ich nur versucht habe, die Warnmeldung zu unterdrücken und eine benutzerdefinierte Warnmeldung für den Benutzer anzuzeigen. Diese einfache und offensichtliche Lösung hat mir also geholfen:
Und wenn nötig, schalten Sie die Fehlerberichterstattung danach zurück:
quelle