Wysyłaj dane POST przez surowy plik json z listonoszem

107

Mam Postmana (tego, który nie otwiera się w Chrome) i próbuję wykonać żądanie POST przy użyciu surowego json.

Na karcie Body mam zaznaczone „raw” i „JSON (application / json)” z tym treścią:

{
    "foo": "bar"
}

Dla nagłówka mam 1, Content-Type: application/json

Po stronie PHP robię print_r($_POST);na razie i otrzymuję pustą tablicę.


Jeśli używam jQuery i robię:

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

Otrzymuję zgodnie z oczekiwaniami:

Array
(
    [foo] => bar
)

Dlaczego więc nie działa z Postmanem?


Zrzuty ekranu listonosza:

wprowadź opis obrazu tutaj

i nagłówek:

wprowadź opis obrazu tutaj

Dallas
źródło
Spróbuj $ _REQUEST zamiast $ _POST i var_dump () zamiast print_r ()
Deep
@Deep Dostaję array(1) {["foo"]=> string(3) "bar"}z jQuery i nadal pustą tablicę z Postmanem:array(0) {}
Dallas
Więc Listonosz nie wysyła prośby
Deep
@smerny w Twoim poście fieldsi foonie pasuje, więc nie zadziała, nie jestem pewien, czy to literówka, ale upewnij się, że pasują
meda
@meda, tak, to była literówka, ale gdybym miał pola, nadal powinien mieć wynik w zrzucie zmiennej $ _REQUEST lub $ _POST
Dallas,

Odpowiedzi:

38

W przeciwieństwie jQuerydo czytania surowego JSON, będziesz musiał zdekodować go w PHP.

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

php://input jest strumieniem tylko do odczytu, który umożliwia odczyt surowych danych z treści żądania.

$_POSTto zmienne formularza, będziesz musiał przełączyć się na formradiobutton, postmana następnie użyj:

foo=bar&foo2=bar2

Aby opublikować surowy za jsonpomocą jquery:

$.ajax({
    "url": "/rest/index.php",
    'data': JSON.stringify({foo:'bar'}),
    'type': 'POST',
    'contentType': 'application/json'
});
meda
źródło
tak exaclty wysyłanie JSON vs zmienne post są różne
meda
43

Po prostu zaznacz opcję JSON z listy rozwijanej obok binarnej; kiedy klikniesz „raw”. To powinno wystarczyć

synon umiejętności przekazać json do listonosza

Itachi
źródło
4
to jest dość stary post ... ale jeśli spojrzysz na pytanie, zobaczysz, że zrobiłem dokładnie to. możesz chcieć przeczytać pytanie, wybraną odpowiedź i komentarze do wybranej odpowiedzi, aby lepiej zrozumieć problem i rozwiązanie.
Dallas
1
Jasne, ale to faktycznie wskazało problem, który miałem; Wybrałem „Tekst”, a nie application / json, mimo że było to już wspomniane w sekcji Nagłówki. To zagmatwane; jeśli wybierzesz „Tekst”, zostanie wyświetlony cały „kod” POST protokołu HTTP, w tym JSON, który powinien działać, ponieważ jest to pełne wywołanie POST, a nie tylko json.
Ted
7

odpowiedź meda jest całkowicie poprawna, ale kiedy skopiowałem kod, wyskoczył mi błąd!

Gdzieś w tekście "php://input"znajduje się nieprawidłowy znak (może jeden z cudzysłowów?).

Kiedy wpisałem "php://input"kod ręcznie, zadziałało. Zajęło mi trochę czasu, zanim się zorientowałem!

CoredusK
źródło
1
Cieszę się, że przewinąłem trochę dalej i zobaczyłem to - mam ten sam problem. Dobre znalezisko!
Charlie Stanard
2
Wygląda na to, że ktoś poprawił to w edycji postu medy. Ale przejrzałem historię edycji i stwierdziłem, że oryginalny post miał 200c 200b(znaki o zerowej szerokości) między „n” i „p” w polu „wejście”. Nie jestem pewien, jak skończył z tym, ale teraz jest to naprawione.
Dallas
6

Miałem ten sam problem, działał dla mnie następujący kod:

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

Neo
źródło
1

Zainstaluj natywną aplikację Postman. Rozszerzenie Chrome zostało wycofane. (Mój otwierał się we własnym oknie, ale nadal działał jako aplikacja Chrome)

Jaroslav Štreit
źródło
2
To nie odpowiada na pytanie.
jhpratt
@jhpratt faktycznie to robi. Miałem ten sam problem. W przypadku korzystania z aplikacji Postman działało. Pytanie brzmi: dlaczego więc nie działa z Postmanem?
Jaroslav Štreit