Ich sende als POST an eine PHP-Seite Folgendes:
{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.
Itay Moav-Malimovka
Ich sende als POST an eine PHP-Seite Folgendes:
{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.
rdlowrey
So greifen Sie auf den Entitätstext einer POST- oder PUT-Anforderung (oder einer anderen HTTP-Methode) zu:
$entityBody = file_get_contents('php://input');
Auch der STDIN
Konstante ist ein bereits geöffneter Stream php://input
also können Sie alternativ Folgendes tun:
$entityBody = stream_get_contents(STDIN);
Von dem Manueller PHP-Eintrag bei I/O-StreamsDokumente:
php://eingabe ist ein schreibgeschützter Stream, mit dem Sie Rohdaten aus dem Anforderungstext lesen können. Im Fall von POST-Anforderungen ist die Verwendung vorzuziehen php://eingabe anstatt
$HTTP_RAW_POST_DATA
da es nicht von speziellen php.ini-Anweisungen abhängt. Darüber hinaus für die Fälle, in denen
$HTTP_RAW_POST_DATA
standardmäßig nicht gefüllt ist, ist es eine möglicherweise weniger speicherintensive Alternative zur Aktivierung von always_populate_raw_post_data. php://eingabe ist mit enctype=”multipart/form-data” nicht verfügbar.
Insbesondere möchten Sie darauf hinweisen, dass die php://input
streamen, unabhängig davon, wie Sie in einem Web-SAPI darauf zugreifen, ist nicht auffindbar. Dies bedeutet, dass es nur einmal gelesen werden kann. Wenn Sie in einer Umgebung arbeiten, in der routinemäßig große HTTP-Entity-Bodys hochgeladen werden, möchten Sie die Eingabe möglicherweise in ihrer Stream-Form beibehalten (anstatt sie wie im ersten Beispiel oben zu puffern).
Um die Stream-Ressource zu pflegen, kann so etwas hilfreich sein:
<?php
function detectRequestBody() {
$rawInput = fopen('php://input', 'r');
$tempStream = fopen('php://temp', 'r+');
stream_copy_to_stream($rawInput, $tempStream);
rewind($tempStream);
return $tempStream;
}
php://temp
ermöglicht es Ihnen, den Speicherverbrauch zu verwalten, da es transparent zum Dateisystemspeicher wechselt, nachdem eine bestimmte Datenmenge gespeichert wurde (standardmäßig 2 MB). Diese Größe kann in der Datei php.ini oder durch Anhängen manipuliert werden /maxmemory:NN
wo NN
ist die maximale Datenmenge in Bytes, die vor der Verwendung einer temporären Datei im Speicher bleiben soll.
Natürlich sollten Sie diese Funktionalität in einer Webanwendung nicht benötigen, es sei denn, Sie haben einen wirklich guten Grund für die Suche im Eingabestrom. Das einmalige Lesen des HTTP-Request-Entity-Body reicht normalerweise aus – lassen Sie Clients nicht den ganzen Tag warten, während Ihre App herausfindet, was zu tun ist.
Beachten Sie, dass php://input nicht für Anfragen verfügbar ist, die a angeben Content-Type: multipart/form-data
Header (enctype="multipart/form-data"
in HTML-Formularen). Dies resultiert daraus, dass PHP die Formulardaten bereits in die geparst hat $_POST
superglobal.
Bitte beachten Sie, dass afaics, der STDIN-Stream nicht auf Systemen verfügbar ist, auf denen PHP mit CGI ausgeführt wird, dh über mod_fcgid oder mod_fastcgi usw.
– schlau
28. September 2013 um 11:17 Uhr
aber ich übergebe Variable (als Formulardaten) mit der Anfrage, wie kann ich auf den angegebenen Wert zugreifen, ich übergebe grant_type=password&username=user&password=pass als Formulardatenkörper mit der Anfrage, wie bekomme ich grant_type von ” $ EntityBody”
– AnvarPk
5. Februar 2016 um 5:02 Uhr
nach meinem Test, dies php://input
ist leer für application/x-www-form-urlencoded
Inhaltstyp (nebenbei multipart/form-data
)
– Jakow L
16. Februar 2018 um 23:59 Uhr
Um die Antwort von @scy zu erweitern: STDIN ist nicht verfügbar, aber php://input
ist. Also während (Fast)CGI-Konfigurationen stream_get_contents(STDIN)
wird nicht funktionieren, file_get_contents("php://input")
Wille.
– Sinus das Tentakel
15. Januar 2019 um 19:45 Uhr
Rückgabewert im Array
$data = json_decode(file_get_contents('php://input'), true);
In diesem Szenario müssen Sie nun die durchlaufen $data
assoziatives Array, um zu überprüfen, ob jeder Wert so codiert ist, wie Sie es wünschen. Die “Stream-zu-Datentyp”-Sichtweise mag simpel sein, aber sie ist möglicherweise nicht so effizient wie der Umgang mit der Codierung in der “Stream-Form” unter Verwendung eines Stream-Filters. Wenn Sie sich nicht mit Codierungsproblemen befassen und nur bereinigen und validieren, verpassen Sie einen Schritt.
– Anthony Rutledge
22. November 2019 um 15:24 Uhr
Es ist eine sehr gute Möglichkeit, Daten aus dem Körper in PHP MVC zu posten.
– Azade
1. Juni 2021 um 16:00 Uhr
Legolas
Ein möglicher Grund für eine leere $_POST
ist, dass die Anfrage nicht ist POST
oder nicht POST
mehr … Es hat vielleicht als Post begonnen, ist aber auf a gestoßen 301
oder 302
irgendwo umleiten, worauf geschaltet wird GET
!
Prüfen $_SERVER['REQUEST_METHOD']
um zu prüfen, ob dies der Fall ist.
Siehe https://stackoverflow.com/a/19422232/109787 für eine gute Diskussion darüber, warum dies nicht passieren sollte, aber immer noch passiert.
Diese Frage wurde im Zusammenhang mit der Entwicklung einer REST-API-Plattform gestellt.
– Itay Moav-Malimovka
16. März 2016 um 15:16 Uhr
Ich bin mir nicht sicher was du meinst? Eine REST-API könnte genauso gut Weiterleitungen in ihrem Pfad finden, das war das Problem, das ich hatte.
– Legolas
17. März 2016 um 10:13 Uhr
Ich meinte, als ich die Frage stellte, versuchte ich nicht, einen Fehler zu beheben, sondern versuchte herauszufinden, wie man ihn entwickelt.
– Itay Moav-Malimovka
17. März 2016 um 11:33 Uhr
Dieser Hinweis hat mir den Tag gerettet. Der empfangende Server wurde neu konfiguriert, um auf https umzuleiten, wodurch einige API-Clients beschädigt wurden.
– DesertEagle
15. Februar 2017 um 10:20 Uhr
@zackygaurav vielleicht wurde es von der URL ohne / zu der mit / umgeleitet?
– Legolas
26. November 2018 um 16:28 Uhr
function getPost()
{
if(!empty($_POST))
{
// when using application/x-www-form-urlencoded or multipart/form-data as the HTTP Content-Type in the request
// NOTE: if this is the case and $_POST is empty, check the variables_order in php.ini! - it must contain the letter P
return $_POST;
}
// when using application/json as the HTTP Content-Type in the request
$post = json_decode(file_get_contents('php://input'), true);
if(json_last_error() == JSON_ERROR_NONE)
{
return $post;
}
return [];
}
print_r(getPost());
Dies ist ein Beispiel dafür, wie man eine PHP-API mit erstellt file_get_contents("php://input")
und verwendet in javascript
verwenden ajax
mit XMLHttpRequest
.
var xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function () {
if (this.readyState == 4 && this.status == 200) {
console.log("done");
}
}
};
xhttp.open("POST", "http://127.0.0.1:8000/api.php", true);
xhttp.send(JSON.stringify({
username: $(this).val(),
email:email,
password:password
}));
$data = json_decode(file_get_contents("php://input"));
$username = $data->username;
$email = $data->email;
$password = $data->password;
Arya McCarthy
Wenn Sie die HTTP-PECL-Erweiterung installiert haben, können Sie die verwenden http_get_request_body()
Funktion, um Körperdaten als Zeichenfolge zu erhalten.
QUentin
Überprüf den $HTTP_RAW_POST_DATA
Variable
Die bevorzugte Methode für den Zugriff auf die POST-Rohdaten ist php://input
. $HTTP_RAW_POST_DATA
ist nicht mit verfügbar enctype="multipart/form-data"
.
– Nichtigkeit
13. Januar 2014 um 21:45 Uhr
Diese Funktion wurde in PHP 5.6.0 VERWORFEN und ab PHP 7.0.0 ENTFERNT.
– Karl
16. Februar 2016 um 10:54 Uhr
Die Antworten haben nicht so viele Upvotes wie der obige Kommentar 🙂
– T. Todua
8. Oktober 2020 um 21:13 Uhr
Dies ist eine hilfreiche Frage für Personen, die RESTful-APIs erstellen möchten. Die meisten wissen nicht, wie sie auf die rohen Eingabedaten zugreifen sollen, die an ihre Skripte gesendet werden, da sie nicht über die verfügbar sind
$_POST
superglobal. Dies gilt (insbesondere) auch für PUT-Requests, da PHP kein entsprechendes Superglobal hat.– rdlowrey
20. Januar 2012 um 18:20 Uhr
Mögliches Duplikat von How to get request content (body) in PHP?
– Jakow L
14. Februar 2018 um 13:11 Uhr
Es ist erwähnenswert, dass der Name $_POST ist irreführend, da nicht jede Art von Daten aus einer POST-Anforderung vorhanden ist, sondern nur, wenn der Inhaltstyp vorhanden ist application/x-www-form-urlencoded oder multipart/form-data
– Petruza
2. Mai 2019 um 20:23 Uhr