Senden Sie POST-Daten über Raw Json mit dem Postboten

107

Ich habe Postman (der in Chrome nicht geöffnet wird) und versuche, eine POST-Anfrage mit raw json zu erstellen.

Auf der Registerkarte Body habe ich "raw" ausgewählt und "JSON (application / json)" mit diesem Body:

{
    "foo": "bar"
}

Für den Header habe ich 1, Content-Type: application/json

Auf der PHP-Seite mache ich das gerade print_r($_POST);und bekomme ein leeres Array.


Wenn ich jQuery verwende und Folgendes tue:

$.ajax({
    "type": "POST",
    "url": "/rest/index.php",
    "data": {
        "foo": "bar"
    }
}).done(function (d) {
    console.log(d);
});

Ich bekomme wie erwartet:

Array
(
    [foo] => bar
)

Warum funktioniert es nicht mit Postman?


Postboten-Screenshots:

Geben Sie hier die Bildbeschreibung ein

und Header:

Geben Sie hier die Bildbeschreibung ein

Dallas
quelle
Versuchen Sie $ _REQUEST statt $ _POST und var_dump () statt print_r ()
Deep
@ Deep Ich bekomme array(1) {["foo"]=> string(3) "bar"}mit jQuery und noch ein leeres Array mit Postman:array(0) {}
Dallas
Also Postbote sendet keine Anfrage
Deep
@smerny in Ihrem Beitrag fieldsund wird foonicht übereinstimmen, daher wird es nicht funktionieren. Ich bin nicht sicher, ob es ein Tippfehler ist, aber stellen Sie sicher, dass sie übereinstimmen
meda
@meda, richtig, das war ein Tippfehler, aber wenn ich Felder hätte, sollte es immer noch im var-Dump von $ _REQUEST oder $ _POST ausgegeben werden
Dallas

Antworten:

38

Anders als jQueryzum Lesen von Raw müssen JSONSie es in PHP dekodieren.

print_r(json_decode(file_get_contents("php://input"), true));

php://input ist ein schreibgeschützter Stream, mit dem Sie Rohdaten aus dem Anforderungshauptteil lesen können.

$_POSTformWenn es sich um Formularvariablen handelt, müssen Sie zum Radiobutton wechseln und dann Folgendes postmanverwenden:

foo=bar&foo2=bar2

So posten Sie roh jsonmit jquery:

$.ajax({
    "url": "/rest/index.php",
    'data': JSON.stringify({foo:'bar'}),
    'type': 'POST',
    'contentType': 'application/json'
});
meda
quelle
ja genau posting json vs post variablen sind unterschiedlich
meda
43

Aktivieren Sie einfach die JSON-Option in der Dropdown-Liste neben "Binär". wenn Sie auf raw klicken. Das sollte reichen

Skill Synon Pass Json an Postbote

Itachi
quelle
4
Dies ist ein ziemlich alter Beitrag. Aber wenn Sie sich die Frage ansehen, werden Sie sehen, dass ich genau das getan habe. Möglicherweise möchten Sie die Frage, die ausgewählte Antwort und die Kommentare zur ausgewählten Antwort lesen, um das Problem und die Lösung besser zu verstehen.
Dallas
1
Sicher, aber das hat tatsächlich das Problem aufgezeigt, das ich hatte; Ich hatte "Text" ausgewählt, nicht application / json, obwohl dies bereits im Abschnitt "Überschriften" erwähnt wurde. Es ist verwirrend; Wenn Sie "Text" wählen, wird der gesamte "Code" des HTTP-POST angezeigt, einschließlich des JSON, von dem ich erwartet hatte, dass er funktioniert, da es sich um einen vollständigen POST-Aufruf handelt, nicht nur um den JSON.
Ted
7

Die Antwort von meda ist völlig legitim, aber als ich den Code kopierte, bekam ich einen Fehler!

Irgendwo in der "php://input"gibt es ein ungültiges Zeichen (vielleicht eines der Anführungszeichen?).

Wenn ich den "php://input"Code manuell eingegeben habe , hat es funktioniert. Ich habe eine Weile gebraucht, um das herauszufinden!

CoredusK
quelle
1
Ich bin froh, dass ich etwas weiter nach unten gescrollt habe und dies gesehen habe - ich hatte das gleiche Problem. Guter Fund!
Charlie Stanard
2
Es sieht so aus, als hätte jemand es in einer Bearbeitung von Medas Post behoben. Aber ich habe mir den Bearbeitungsverlauf angesehen und festgestellt, dass der ursprüngliche Beitrag 200c 200b(Zeichen mit einer Breite von Null) zwischen "n" und "p" in "Eingabe" liegt. Ich bin mir nicht sicher, wie er dazu gekommen ist, aber es ist jetzt behoben.
Dallas
5

Ich hatte das gleiche Problem, der folgende Code funktionierte für mich:

$params = (array) json_decode(file_get_contents('php://input'), TRUE);
print_r($params);

Neo
quelle
1

Installieren Sie die native Postman-App. Die Chrome-Erweiterung ist veraltet. (Meins öffnete sich in einem eigenen Fenster, lief aber immer noch als Chrome-App)

Jaroslav Štreit
quelle
2
Dies beantwortet die Frage nicht.
Jhpratt
@jhpratt eigentlich tut es. Ich hatte das gleiche Problem. Bei Verwendung der Postman-App hat es funktioniert. Die Frage ist: Warum funktioniert es nicht mit Postman?
Jaroslav Štreit