2016-10-28 7 views
1

Ich bin auf ein seltsames Problem gestoßen, das ich nicht vollständig verstehe. Mein Webserver über PHP ruft eine PHP API auf. Der Rest api leitet die Anfrage basierend auf dem Verb an die entsprechende Funktion in der photos.php-Datei weiter. GET-, PUT- und DELETE-Anfragen funktionieren alle ordnungsgemäß, die folgende POST-Anfrage gibt jedoch 404 Not Found zurück. Das Problem ist, dass es gut aus dem Browser funktioniert oder wenn ich es von Postman aus anrufe. Die Datei existiert absolut und hat einen entsprechenden Zugriff. Ich habe dieses Problem auch nicht mit anderen POST-Anfragen.PHP file_get_contents gibt 404 Not Found zurück - Ignoriere Fehler

Nach etwa 5 Stunden Kampf mit diesem und dem Lesen von 100 Seiten/Artikeln stieß ich auf einen obskuren Verweis auf die Option stream_context_create von "ignore_errors" => true. In dem Moment, als ich diese Zeile hinzufügte, verschwand der 404 und ich konnte den api-Endpunkt erreichen.

Ich verstehe nicht, wie das möglich ist. Die Datei war entweder da oder es war nicht so der 404 war eine Lüge. Ich möchte Fehler nicht ignorieren, um dies zum Laufen zu bringen. Irgendeine Idee, was hier vor sich geht?

$apiUrl = 'http://localhost/api/v1/user/john/photos'; 

    // Setup http request 
    $options = ["http" => 
     ["method" => "POST", 
      "header" => "Content-Type: application/json", 
      "ignore_errors" => true, 
      "content" => $data 
      ] 
     ]; 
    // Call API 
    $apiResponse = file_get_contents($apiUrl, NULL, stream_context_create($options)); 

Hier ist der Fehler, den ich erhalten:

<b>Warning</b>: 
file_get_contents(http://localhost/api/v1/user/john/photos): failed to 
open stream: HTTP request failed! HTTP/1.1 404 Not Found 

curl Info:

Array 
(
    [url] => http://localhost/api/v1/user/john/photos 
    [content_type] => text/html; charset=UTF-8 
    [http_code] => 404 
    [header_size] => 214 
    [request_size] => 147 
    [filetime] => -1 
    [ssl_verify_result] => 0 
    [redirect_count] => 0 
    [total_time] => 0.015 
    [namelookup_time] => 0 
    [connect_time] => 0 
    [pretransfer_time] => 0 
    [size_upload] => 0 
    [size_download] => 229 
    [speed_download] => 15266 
    [speed_upload] => 0 
    [download_content_length] => 229 
    [upload_content_length] => -1 
    [starttransfer_time] => 0.015 
    [redirect_time] => 0 
    [redirect_url] => 
    [primary_ip] => 127.0.0.1 
    [certinfo] => Array 
     (
     ) 

    [primary_port] => 80 
    [local_ip] => 127.0.0.1 
    [local_port] => 53224 
) 
Header Info: HTTP/1.1 404 Not Found 
Date: Fri, 28 Oct 2016 15:14:23 GMT 
Server: Apache 
X-Frame-Options: SAMEORIGIN 
X-Powered-By: PHP/5.6.21 
Content-Length: 229 
Connection: close 
Content-Type: text/html; charset=UTF-8 
+0

Sind Sie sicher, dass die URL gültig ist und es nicht Ihr Browser ist der, der es repariert, z. B. einen Schrägstrich oder etwas hinzufügen? –

+0

Welche Version von PHP haben Sie auf welchem ​​System Windows/Linux verwendet? – sebkrueger

+0

das ist wirklich seltsam, ist nicht die ignore_error-Flag verwendet, um die file_get_contents keine Warnungen über den HTTP-Aufruf zu werfen? Die Warnung war die 404 Nachricht? – Pievis

Antwort

0

Wenn Sie die Antwort, warum file_get_contents suchen wurde ohne IGNORE_ERRORS einen Fehler werfen auf wahr gesetzt, dann kommen diese Anweisungen vielleicht näher an die Antwort heran. Bitte beachten Sie, dass diese Anleitung davon ausgeht, dass die PHP-Fehlerprotokolle noch nicht überprüft wurden oder noch nicht nützlich sind und hoffen, diese Probleme zu beheben.

  1. Um Ihr PHP-Fehlerprotokoll setzte diese am Anfang des Skripts (nur vorübergehend für eine Last von der Seite)

    phpinfo() ausfindig zu machen; sterben(); Jetzt

  2. , danach Seite geladen wird und Sie Ihre PHP-info zu sehen, die Suche nach error_log und das Verzeichnis auf Ihrem Rechner finden.

  3. Wenn dieser Wert leer ist, haben Sie möglicherweise log_errors ausgeschaltet oder die Fehler werden in Ihr Apache-Fehlerprotokoll gedruckt. Wenn dies der Fall ist, versuchen Sie, das Apache-Fehlerprotokoll zu finden.

  4. Ersetzen Sie Ihr Fehlerprotokoll durch phpinfo(); sterben(); mit diesen beiden Anrufen. Deaktivieren Sie ignore_errors, und führen Sie die Datei erneut aus.

    error_reporting (E_ALL); ini_set ("display_errors", 1);

  5. Verwenden Sie das Fehlerprotokoll, können Sie Hinweise/Warnungen/Fehler im Zusammenhang mit dem Aufruf file_get_contents finden und diese hier veröffentlichen, wenn sie die Frage nicht klären?

** EDIT **

Okay, mit Locke, erhält die Antwort und Request-Header in vollständig und Ihre Frage mit dem Ausgang zu aktualisieren, bitte.

ch = curl_init(); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
curl_setopt($ch, CURLOPT_VERBOSE, 1); 
curl_setopt($ch, CURLOPT_HEADER, 1); 
// ... 

$response = curl_exec($ch); 

// Then, after your curl_exec call: 
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE); 
$header = substr($response, 0, $header_size); 
$body = substr($response, $header_size); 
+0

Ich habe Fehlermeldeeinstellungen. Ich habe meinen Beitrag aktualisiert, um den genauen Fehler anzuzeigen, den ich sehe. – Runicode

+1

interessant, wenn Sie also den Webserver 404 ignorieren, dann gibt er die api-Daten an Sie zurück. Nach dem 404 muss eine Weiterleitung in der Anwendung vorhanden sein. Wenn Sie die Datei direkt in einem Browser wie Firefox oder Chrome öffnen und den Netzwerkverkehr beibehalten, können Sie möglicherweise feststellen, was nach dem 404 geschieht, damit Sie die Daten abrufen können. – WEBjuju

+0

können Sie uns auf einen Online-Standort verweisen, um den Code der Bibliothek zu überprüfen, die die API ausführt, oder handelt es sich um eine persönlich erstellte API? – WEBjuju

Verwandte Themen