file_get_contents ("php: // input") oder $ HTTP_RAW_POST_DATA, welches ist besser, um den Hauptteil der JSON-Anfrage abzurufen?

120

file_get_contents("php://input")oder $HTTP_RAW_POST_DATA- welches ist besser, um den Text der JSON-Anfrage zu erhalten?

Und welchen Anfragetyp ( GEToder POST) sollte ich verwenden, um JSON-Daten zu senden, wenn ich die Clientseite verwende XmlHTTPRequest?

Meine Frage wurde von dieser Antwort inspiriert: Wie poste ich JSON mit Curl auf PHP?

Zitat aus dieser Antwort:

Aus Protokollsicht file_get_contents("php://input")ist das eigentlich korrekter, da Sie ohnehin nicht wirklich mehrteilige http-Formulardaten verarbeiten.

Manuel Bitto
quelle

Antworten:

195

Tatsächlich php://inputkönnen Sie POST-Rohdaten lesen.

Es ist eine weniger speicherintensive Alternative zu $ ​​HTTP_RAW_POST_DATA und benötigt keine speziellen php.ini-Anweisungen .

php://inputist nicht verfügbar mit enctype="multipart/form-data".

Referenz: http://php.net/manual/en/wrappers.php.php

zaf
quelle
12
Darüber hinaus gilt ab PHP 5.6 $HTTP_RAW_POST_DATAals veraltet und php://inputkann wiederverwendet werden.
Chris Forrence
Siehe auch enable_post_data_reading.
Pacerier
json_decode (file_get_contents ('php: // input'), true) unterstützt dies in PHP 7.1, um $ _GET-Werte von der URL abzurufen?
Kailas
$ HTTP_RAW_POST_DATA ist ab PHP 7
Daniel
15

php: // Eingabe ist a schreibgeschützter Stream, mit dem Sie Rohdaten aus dem Anforderungshauptteil lesen können. Bei POST-Anforderungen ist es vorzuziehen, anstelle von $ HTTP_RAW_POST_DATA die Eingabe php: // zu verwenden, da dies nicht von speziellen php.ini-Anweisungen abhängt . In den Fällen, in denen $ HTTP_RAW_POST_DATA nicht standardmäßig ausgefüllt ist, ist dies eine möglicherweise weniger speicherintensive Alternative zur Aktivierung von always_populate_raw_post_data.

Quelle: http://php.net/manual/en/wrappers.php.php .

Zeeshan Hyder
quelle
4
Darüber hinaus gilt ab PHP 5.6 $HTTP_RAW_POST_DATAals veraltet und php://inputkann wiederverwendet werden.
Chris Forrence
14

file_get_contents (php: // input) - Ruft die POST-Rohdaten ab. Sie müssen diese verwenden, wenn Sie APIs schreiben und XML / JSON / ... -Eingaben benötigen, die von PHP nicht in $ _POST dekodiert werden können. Ein Beispiel:

per Post senden JSON-String

<input type="button" value= "click" onclick="fn()">
<script>
 function fn(){


    var js_obj = {plugin: 'jquery-json', version: 2.3};

    var encoded = JSON.stringify( js_obj );

var data= encoded


    $.ajax({
  type: "POST",
  url: '1.php',
  data: data,
  success: function(data){
    console.log(data);
  }

});

    }
</script>

1.php

//print_r($_POST); //empty!!! don't work ... 
var_dump( file_get_contents('php://input'));
zloctb
quelle
3

Für das Senden der Anfrage sollten die üblichen Regeln gelten. Wenn die Anforderung darin besteht, Informationen abzurufen (z. B. ein Teil-Suchergebnis "Hinweis" oder eine neue Seite, die angezeigt werden soll usw.), können Sie GET verwenden. Wenn die gesendeten Daten Teil einer Aufforderung sind, etwas zu ändern (Datenbank aktualisieren, Datensatz löschen usw.), verwenden Sie POST.

Auf der Serverseite gibt es keinen Grund, die Roheingabe zu verwenden, es sei denn, Sie möchten den gesamten Post / Get-Datenblock auf einmal abrufen. Sie können die gewünschten spezifischen Informationen wie gewohnt über die Arrays _GET / _POST abrufen. AJAX-Bibliotheken wie MooTools / jQuery erledigen den schwierigen Teil der eigentlichen AJAX-Aufrufe und der Codierung von Formulardaten in geeignete Formate für Sie.

Marc B.
quelle
Das ist der Punkt: Ich möchte den gesamten Post / Get-Datenblock in einem Zug erfassen, da JSON ein Format ohne Variablen ist und nur die Daten darstellt.
Manuel Bitto
@Kucebe Ich verstehe nicht, warum dies notwendig ist, warum nicht die JSON-Daten in ein POST-Feld einfügen und damit fertig sein?
Pekka
Wenn Sie den gesamten JSON-Block möchten, können Sie den JSON-Textblock einem Formularfeld zuweisen und ihn so senden. <input type="hidden" name="data" value="json data here" />ist völlig akzeptabel und ermöglicht es Ihnen, es trivial serverseitig mit $ _REQUEST ['data'] abzurufen.
Marc B
3
Das Einbetten von JSON in ein POST-Feld macht den Zweck des HTTP-Inhaltstyp-Tags zunichte und eignet sich nicht so gut zum Debuggen in Fiddler- und Browser-Debuggern (die JSON verstehen können). Außerdem veröffentlichen viele JavaScript-Bibliotheken von Drittanbietern JSON-Nutzdaten als application / json.
CyberMonk
2

Für JSON-Daten ist es viel einfacher, sie als Inhaltstyp "application / json" zu veröffentlichen. Wenn Sie GET verwenden, müssen Sie den JSON in einem Parameter URL-codieren, und es ist etwas chaotisch. Außerdem gibt es beim POST keine Größenbeschränkung. Die Größe von GET ist sehr begrenzt (höchstens 4 KB).

ZZ Coder
quelle
2
Es gibt oft eine Größenbeschränkung für POST, die jedoch normalerweise ziemlich hoch eingestellt ist. Überprüfen Sie Ihre php.ini.
Brad
2

Ihre zweite Frage ist einfach: GET hat sowohl auf der Server- als auch auf der Browserseite eine Größenbeschränkung von 1 bis 2 Kilobyte, sodass Sie jede größere Datenmenge über POST senden müssen.

Pekka
quelle