Ich reiche als POST auf einer PHP-Seite Folgendes ein:
{a:1}
Dies ist der Hauptteil der Anforderung (eine POST-Anforderung).
Was muss ich in PHP tun, um diesen Wert zu extrahieren?
var_dump($_POST);
ist nicht die Lösung, funktioniert nicht.
$_POST
gesendet wurden, da diese nicht über die Superglobale verfügbar sind. Dies gilt (insbesondere) auch für PUT-Anfragen, da PHP kein entsprechendes Superglobal hat.Antworten:
So greifen Sie auf den Entitätstext einer POST- oder PUT-Anforderung (oder einer anderen HTTP-Methode) zu:
Außerdem ist die
STDIN
Konstante ein bereits geöffneter Streamphp://input
, sodass Sie alternativ Folgendes tun können:Von der PHP manuellen Eingabe auf I / O - Streams docs :
Insbesondere sollten Sie beachten, dass der
php://input
Stream unabhängig davon, wie Sie in einem Web-SAPI darauf zugreifen, nicht durchsuchbar ist . Dies bedeutet, dass es nur einmal gelesen werden kann. Wenn Sie in einer Umgebung arbeiten, in der routinemäßig große HTTP-Entitätskörper hochgeladen werden, möchten Sie die Eingabe möglicherweise in ihrer Stream-Form beibehalten (anstatt sie wie im ersten Beispiel oben zu puffern).So etwas kann hilfreich sein, um die Stream-Ressource zu pflegen:
php://temp
Mit dieser Option können Sie den Speicherverbrauch verwalten, da nach dem Speichern einer bestimmten Datenmenge (standardmäßig 2 MB) transparent auf den Dateisystemspeicher umgeschaltet wird. Diese Größe kann in den php.ini oder durch Anfügen manipuliert werden/maxmemory:NN
, wobeiNN
die maximale Menge an Daten im Speicher zu halten , bevor eine temporäre Datei, in Bytes verwenden.Natürlich sollten Sie diese Funktionalität in einer Webanwendung nicht benötigen, es sei denn, Sie haben einen wirklich guten Grund, nach dem Eingabestream zu suchen. Normalerweise reicht es aus, den Hauptteil der HTTP-Anforderungsentität einmal zu lesen. Lassen Sie Clients nicht den ganzen Tag warten, während Ihre App herausfindet, was zu tun ist.
Beachten Sie, dass die Eingabe php: // nicht für Anforderungen verfügbar ist, die einen
Content-Type: multipart/form-data
Header angeben (enctype="multipart/form-data"
in HTML-Formularen). Dies resultiert daraus, dass PHP die Formulardaten bereits in das$_POST
Superglobale analysiert hat.quelle
php://input
für denapplication/x-www-form-urlencoded
Inhaltstyp (außerdemmultipart/form-data
)php://input
ist es aber . Wenn also (schnelle) CGI-Konfigurationenstream_get_contents(STDIN)
nicht funktionieren, funktioniert diesfile_get_contents("php://input")
auch.Rückgabewert im Array
quelle
$data
assoziative Array durchlaufen , um zu überprüfen, ob jeder Wert wie gewünscht codiert ist. Die Sichtweise von "Stream-to-Datatype" mag vereinfacht sein, ist jedoch möglicherweise nicht so effizient wie die Codierung in der "Stream-Form" mithilfe eines Stream-Filters. Wenn Sie keine Codierungsprobleme behandeln und lediglich bereinigen und validieren, fehlt Ihnen ein Schritt.Ein möglicher Grund für ein Leerzeichen
$_POST
ist, dass die Anfrage nichtPOST
oder nichtPOST
mehr ... Sie hat möglicherweise als Post begonnen, ist aber irgendwo auf eine301
oder eine302
Weiterleitung gestoßen , auf die umgeschaltet wirdGET
!Überprüfen Sie
$_SERVER['REQUEST_METHOD']
zu überprüfen , ob dies der Fall ist.Unter https://stackoverflow.com/a/19422232/109787 finden Sie eine ausführliche Beschreibung, warum dies nicht passieren sollte, aber dennoch geschieht.
quelle
POST
aber nach der Inspektion zeigte sich, dass es warGET
. Nachdem ich/
am Ende meiner URL eine hinzugefügt hatte , wurde POST angezeigt. Seltsam!Überprüfen Sie die
$HTTP_RAW_POST_DATA
Variablequelle
php://input
.$HTTP_RAW_POST_DATA
ist nicht verfügbar mitenctype="multipart/form-data"
.Wenn Sie die HTTP PECL-Erweiterung installiert haben, können Sie die
http_get_request_body()
Funktion verwenden, um Körperdaten als Zeichenfolge abzurufen.quelle
Wenn Sie die Erweiterung pecl / http installiert haben, können Sie auch Folgendes verwenden:
quelle
quelle
json_last_error() == JSON_ERROR_NONE
istfalse
, ein leeres Array zurückgegeben werden sollte. Was ist, wenn jemand XML oder YAML eingereicht hat? Fügen Sie einen Test für den Inhaltstyp hinzu und gehen Sie von dort aus.$_SERVER
Superglobal finden Sie nützliche Werte, die überprüft werden müssen.http_get_request_body()
wurde explizit für das Abrufen des TextesPUT
und derPOST
Anforderungen gemäß der Dokumentation http://php.net/manual/fa/function.http-get-request-body.php erstelltquelle