Der Grund ist, dass php://input
unabhängig vom Inhaltstyp alle Rohdaten nach den HTTP-Headern der Anfrage zurückgibt.
Die PHP superglobal $_POST
, nur soll Daten umhüllen, die entweder
application/x-www-form-urlencoded
(Standard-Inhaltstyp für einfache Formular-Posts) oder multipart/form-data-encoded
(wird hauptsächlich für Datei-Uploads verwendet) Dies liegt daran, dass dies die einzigen Inhaltstypen sind, die müssen wird von Benutzeragenten unterstützt . Daher erwarten der Server und PHP normalerweise keinen anderen Inhaltstyp (was nicht bedeutet, dass sie nicht können).
Wenn Sie also einfach ein gutes altes HTML form
POSTIEREN, sieht die Anfrage etwa so aus:
Aber wenn Sie viel mit Ajax arbeiten, beinhaltet dieses Problem auch den Austausch komplexerer Daten mit Typen (string, int, bool) und Strukturen (Arrays, Objekte). JSON ist daher in den meisten Fällen die beste Wahl. Aber eine Anfrage mit einer JSON-Nutzlast würde in etwa so aussehen:
%Vor% Der Inhalt wäre nun application/json
(oder zumindest keiner der oben genannten), daher weiß PHPs $_POST
-wrapper (noch) nicht, wie er damit umgehen soll.
Die Daten sind immer noch da, Sie können einfach nicht über den Wrapper darauf zugreifen. Sie müssen es also im rohen Format mit file_get_contents('php://input')
() selbst abholen Es ist nicht multipart/form-data
-coded ).
Auf diese Weise würden Sie auch auf XML-Daten oder einen anderen nicht standardmäßigen Inhaltstyp zugreifen.
Ich wurde angewiesen, die Methode php://input
anstelle von $_POST
zu verwenden, wenn ich mit Ajax-Anfragen von JQuery interagiere. Was ich nicht verstehe, sind die Vorteile der Verwendung dieser Methode gegenüber der globalen Methode application/x-www-form-urlencoded
oder %code% .
Der Grund ist, dass %code% unabhängig vom Inhaltstyp alle Rohdaten nach den HTTP-Headern der Anfrage zurückgibt.
Die PHP superglobal %code% , nur soll Daten umhüllen, die entweder
sindDies liegt daran, dass dies die einzigen Inhaltstypen sind, die müssen wird von Benutzeragenten unterstützt . Daher erwarten der Server und PHP normalerweise keinen anderen Inhaltstyp (was nicht bedeutet, dass sie nicht können).
Wenn Sie also einfach ein gutes altes HTML %code% POSTIEREN, sieht die Anfrage etwa so aus:
%Vor%Aber wenn Sie viel mit Ajax arbeiten, beinhaltet dieses Problem auch den Austausch komplexerer Daten mit Typen (string, int, bool) und Strukturen (Arrays, Objekte). JSON ist daher in den meisten Fällen die beste Wahl. Aber eine Anfrage mit einer JSON-Nutzlast würde in etwa so aussehen:
%Vor%Der Inhalt wäre nun %code% (oder zumindest keiner der oben genannten), daher weiß PHPs %code% -wrapper (noch) nicht, wie er damit umgehen soll.
Die Daten sind immer noch da, Sie können einfach nicht über den Wrapper darauf zugreifen. Sie müssen es also im rohen Format mit %code% () selbst abholen Es ist nicht %code% -coded ).
Auf diese Weise würden Sie auch auf XML-Daten oder einen anderen nicht standardmäßigen Inhaltstyp zugreifen.
Wenn Post-Daten fehlerhaft sind, enthält $ _POST nichts. Php: // input wird jedoch die fehlerhafte Zeichenfolge haben.
Zum Beispiel gibt es einige Ajax-Anwendungen, die keine korrekte post-key-value-Sequenz zum Hochladen einer Datei bilden und nur die gesamte Datei als Post-Daten ausgeben, ohne Variablennamen oder irgendetwas. $ _POST ist leer, $ _FILES ebenfalls leer, und php: // input enthält eine exakte Datei, die als String geschrieben ist.
%code% kann Ihnen die rohen Bytes der Daten geben. Dies ist nützlich, wenn die POST-Daten eine JSON-codierte Struktur sind, was häufig bei einer AJAX POST-Anfrage der Fall ist.
Hier ist eine Funktion, die genau das macht:
%Vor%Das Array %code% ist sinnvoller, wenn Sie Schlüsselwertdaten aus einem Formular bearbeiten, das von einem herkömmlichen POST übergeben wurde. Dies funktioniert nur, wenn die POST-Daten in einem anerkannten Format sind, normalerweise %code% (siehe Ссылка für Details).
Wenn Post-Daten fehlerhaft sind, enthält $ _POST nichts. Php: // input wird jedoch die fehlerhafte Zeichenfolge haben.
Zum Beispiel gibt es einige Ajax-Anwendungen, die keine korrekte post-key-value-Sequenz zum Hochladen einer Datei bilden und nur die gesamte Datei als Post-Daten ausgeben, ohne Variablennamen oder irgendetwas. $ _POST ist leer, $ _FILES ebenfalls leer, und php: // input enthält eine exakte Datei, die als String geschrieben ist.