Wie bekomme ich den Text eines POST in PHP?

Lesezeit: 6 Minuten

Wie bekomme ich den Text eines POST in PHP
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.

  • 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


1646981048 386 Wie bekomme ich den Text eines POST in PHP
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://inputalso 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:NNwo 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


Wie bekomme ich den Text eines POST in PHP
Legolas

Ein möglicher Grund für eine leere $_POST ist, dass die Anfrage nicht ist POSToder 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;

1646981049 37 Wie bekomme ich den Text eines POST in PHP
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.

1646981049 210 Wie bekomme ich den Text eines POST in PHP
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


990120cookie-checkWie bekomme ich den Text eines POST in PHP?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy