401 Stimmen

Wie erhalte ich den Inhalt eines POSTs in php?

Ich übermittle als POST an eine php-Seite das Folgende:

{a:1}

Dies ist der Text der Anfrage (eine POST-Anfrage).
Was muss ich in PHP tun, um diesen Wert zu extrahieren?

var_dump($_POST); 

ist nicht die Lösung und funktioniert nicht.

730voto

rdlowrey Punkte 38783

Zum Zugriff auf den Entity-Body einer POST- oder PUT-Anfrage (oder einer anderen HTTP-Methode):

$entityBody = file_get_contents('php://input');

Auch die STDIN Konstante ist ein bereits geöffneter Stream zu php://input so können Sie alternativ tun:

$entityBody = stream_get_contents(STDIN);

Von der PHP-Handbucheintrag zu I/O-Streams docs :

php://eingabe ist ein Nur-Lese-Stream, mit dem Sie Rohdaten lesen können aus dem Anfragekörper lesen können. Im Falle von POST-Anfragen ist es vorzuziehen zu verwenden php://eingabe anstelle von $HTTP_RAW_POST_DATA a von speziellen php.ini-Anweisungen abhängt. [ ] $HTTP_RAW_POST_DATA nicht standardmäßig ausgefüllt ist, ist es weniger speicherintensive Alternative zur Aktivierung von always_populate_raw_post_data. php://eingabe i enctype="multipart/form-data".

Insbesondere sollten Sie beachten, dass die php://input Stream, unabhängig davon, wie Sie in einem Web-SAPI darauf zugreifen, ist nicht auffindbar . Das bedeutet, dass sie nur einmal gelesen werden kann. Wenn Sie in einer Umgebung arbeiten, in der routinemäßig große HTTP-Entity-Bodies hochgeladen werden, möchten Sie die Eingabe vielleicht in ihrer Stream-Form beibehalten (anstatt sie wie im ersten Beispiel oben zu puffern).

Um die Ressource Strom zu erhalten, 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 nach einer bestimmten Datenmenge (standardmäßig 2M) transparent auf das Dateisystem umschaltet. Diese Größe kann in der Datei php.ini oder durch Anhängen von /maxmemory:NNNN ist die maximale Datenmenge in Bytes, die im Speicher gehalten werden soll, bevor eine temporäre Datei verwendet wird.

Natürlich sollten Sie diese Funktion in einer Webanwendung nicht benötigen, es sei denn, Sie haben einen wirklich guten Grund, den Eingabestrom zu durchsuchen. Das einmalige Lesen des HTTP-Request-Entity-Bodys ist in der Regel ausreichend - lassen Sie die Clients nicht den ganzen Tag warten, während Ihre Anwendung herausfindet, was zu tun ist.

Beachten Sie, dass php://input nicht für Anfragen verfügbar ist, die eine Content-Type: multipart/form-data Kopfzeile ( enctype="multipart/form-data" in HTML-Formularen). Dies ist darauf zurückzuführen, dass PHP die Formulardaten bereits in die $_POST superglobal.

50voto

umesh bhanderi Punkte 541

Rückgabewert in Array

 $data = json_decode(file_get_contents('php://input'), true);

21voto

Legolas Punkte 825

Ein möglicher Grund für eine leere $_POST ist, dass der Antrag nicht POST , oder nicht POST mehr... Es mag als Post begonnen haben, aber stieß auf ein 301 o 302 irgendwo umzuleiten, die auf GET !

Überprüfen Sie $_SERVER['REQUEST_METHOD'] um zu prüfen, ob dies der Fall ist.

Véase https://stackoverflow.com/a/19422232/109787 für eine gute Diskussion darüber, warum dies nicht geschehen sollte, aber dennoch geschieht.

16voto

Hatzegopteryx Punkte 502
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());

12voto

L3xpert Punkte 649

Dies ist ein Beispiel dafür, wie man eine php api mit file_get_contents("php://input") und verwendet in javascript mit ajax avec 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;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X