it-swarm.com.de

file_get_contents ('php: // input') gibt immer eine leere Zeichenkette zurück

Ich erstelle eine PHP RESTful-API und folge diesem Tutorial. Die folgende Funktion, die die mit der Anforderung gesendeten Daten zurückgeben soll, wenn die 'put'-Methode verwendet wird, gibt jedes Mal null zurück:

file_get_contents('php://input').

Ich habe sogar das vollständige Codebeispiel im Tutorial heruntergeladen und getestet und es gibt immer noch null zurück.

Ich benutze cURL und den folgenden Befehl, um die 'put'-Methode zu testen:

curl -i -X PUT -d '{"address":"Sunset Boulevard"}' http://localhost/clients/ryan.

Ich habe Tage damit verschwendet und es immer noch nicht geschafft, die JSON-Daten zu lesen. Was mache ich falsch?

11
Igor

Zunächst konnte ich diesen Code ausführen und es hat gut funktioniert:

--Terminal---------
//I ran this curl request against my own php file:
curl -i -X PUT -d '{"address":"Sunset Boulevard"}' http://localhost/test.php


--PHP--------------
//get the data
$json = file_get_contents("php://input");

//convert the string of data to an array
$data = json_decode($json, true);

//output the array in the response of the curl request
print_r($data);

Wenn dies nicht funktioniert, überprüfen Sie die Konsole auf Fehler und Ihre PHP-Einstellungen:

  1. stellen Sie sicher, dass die URL-URL tatsächlich funktioniert und keine Fehler zurückgibt.
  2. Öffnen Sie ein anderes Terminal/Console-Fenster und führen Sie tail -f /path/to/the/php/log/file aus, damit Sie die Ausgabe dieser PHP-Aufrufe tatsächlich sehen können.
  3. häufig erhalten Benutzer diese Fehlermeldung: file_get_contents(file://input): failed to open stream: no suitable wrapper could be found, die entweder einen Tippfehler der Zeichenfolge "file: // input" oder die Tatsache, dass allow_url_fopen in php deaktiviert ist, anzeigen kann (siehe # 5, wenn Sie sich nicht sicher sind).
  4. vergewissere dich, dass dein Code korrekt ist, und damit meine ich, dass du keine falschen Argumente und Dinge eingibst ... Sachen, die in Netbeans nicht unbedingt unterstrichen werden.
  5. denken Sie daran, dass file_get_contents nur funktioniert, wenn allow_url_fopen in den Einstellungen von PHP auf true gesetzt ist. Dies ist etwas, das in der php.ini festgelegt ist. Sie können die Einstellungen jedoch auch zur Laufzeit ändern, indem Sie etwas vor dem anderen Code in die Zeilen des folgenden Codes schreiben: 

    ini_set("allow_url_fopen", true);
    
8
Kristian

Wie an anderer Stelle im Internet angegeben , wird php://input-Inhalt nicht durchlaufen, wenn die Anforderung umgeleitet wird. Möglicherweise hat Ihr Webserver eine Umleitung von einer URL, die mit www beginnt, zu einer URL ohne www oder von URLs, die HTTP verwenden, zu URLs, die HTTPS verwenden. Überprüfen Sie Ihre Webserver-Protokolle, um dies zu überprüfen, und verhalten Sie sich entsprechend, um die Umleitung bei Anrufen des Webservice zu vermeiden.

3

Ich habe eine Headerdatei mit diesem Code geschrieben:

if($_SERVER["REQUEST_METHOD"] == "POST" && $_SERVER["CONTENT_TYPE"] == "application/json")
{
  $data = file_get_contents("php://input", false, stream_context_get_default(), 0, $_SERVER["CONTENT_LENGTH"]);
  global $_POST_JSON;
  $_POST_JSON = json_decode($_REQUEST["JSON_RAW"],true);

  // merge JSON-Content to $_REQUEST 
  if(is_array($_POST_JSON)) $_REQUEST   = $_POST_JSON+$_REQUEST;
}

Er prüft den richtigen Inhaltstyp und liest nur so viele Posteingaben, wie in Content-Length-Header angegeben .. Wenn er eine gültige JSON-Datei erhält, hat er ein globales Array $ _POST_JSON erstellt.

Sie können also mit Ihrem JSON-Content auf ähnliche Weise mit url-codierten POST - Werten arbeiten.

Beispiel:

 echo $_POST_JSON["address"];
 // or
 echo $_REQUEST["address"];
2
Radon8472

Ich hatte auch diesen Fehler, meine Lösung besteht darin, das Datenformat in RAW zu ändern. 

Ich bekomme es von php doc wo es heißt 

:php://input is not available with enctype="multipart/form-data".
2
Timtcng.sen

Der korrekte Funktionsaufruf lautet:

file_get_contents("php://input");

Sie sollten eine Fehlermeldung erhalten, dass php:input nicht vorhanden ist ...

In jedem Fall ist PUT für das Hochladen von Dateien auf den Server vorgesehen, sofern der Server dies unterstützt. Normalerweise verwenden Sie POST mit einem Content-Type-Header, der für den Inhalt geeignet ist.

1

Unter Windows scheint die Kombination von "einfachen" Anführungszeichen "nicht zu funktionieren. Verwenden Sie Escape für Anführungszeichen in Ihren Json-Daten (wie unten) und es sollte funktionieren

curl -X PUT -d "{\"address\":\"Sunset Boulevard\"}" http://localhost/clients/ryan
1
sambha

Nach Belieben bearbeiten

function getPostObject() {
    $str = file_get_contents('php://input');
    $std = json_decode($str);
    if ($std === null) {
        $std = new stdClass();
        $array = explode('&', $str);
        foreach ($array as $parm) {
            $parts = explode('=', $parm);
            if(sizeof($parts) != 2){
                continue;
            }
            $key = $parts[0];
            $value = $parts[1];
            if ($key === NULL) {
                continue;
            }
            if (is_string($key)) {
                $key = urldecode($key);
            } else {
                continue;
            }
            if (is_bool($value)) {
                $value = boolval($value);
            } else if (is_numeric($value)) {
                $value += 0;
            } else if (is_string($value)) {
                if (empty($value)) {
                    $value = null;
                } else {
                    $lower = strtolower($value);
                    if ($lower === 'true') {
                        $value = true;
                    } else if ($lower === 'false') {
                        $value = false;
                    } else if ($lower === 'null') {
                        $value = null;
                    } else {
                        $value = urldecode($value);
                    }
                }
            } else if (is_array($value)) {
                // value is an array
            } else if (is_object($value)) {
                // value is an object
            }
            $std->$key = $value;
        }
        // length of post array
        //$std->length = sizeof($array);
    }
    return $std;
}
0

Ich hatte das gleiche problem Schließlich stellte ich fest, dass das Problem darin bestand, dass ich auf der Clientseite das JSON-Objekt nicht stringifiziert hatte (zuvor habe ich nodejs server verwendet und es war OK). Sobald ich das getan habe, habe ich die Daten in $ _POST (nicht als json) als reguläre Parameter erhalten.

0
Shlomo

Ich sehe das problem,

Sie müssen am Ende der Anforderungs-URL dateiname.php hinzufügen oder die Serverregeln in der .htaccess-Datei neu schreiben, um dies zu umgehen.

curl -i -X PUT -d '{"address":"Sunset Boulevard"}' http://localhost/clients/ryan/{filename.php}

ersetzen Sie {Dateiname.php} durch den entsprechenden Dateinamen. :)

0
Mandan Sharma

Stellen Sie sicher, dass keine Weiterleitungen aktiv sind (wie http zu http:// Oder .php Zu /)

file_get_contents(php://input) leitet den Textinhalt nicht über Weiterleitungen weiter (obwohl ich mir vorstelle, dass es möglich ist, den Webserver dafür zu konfigurieren).

Eine schnelle Möglichkeit, nach Weiterleitungen zu suchen, besteht darin, die URL mit der Funktion "Einrollen" zu überprüfen. In der Befehlszeile: curl -IL http://example.com/api

0
billrichards