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.
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.
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:NN
où NN
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.
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.
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 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 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.