Jak pobrać ładunek żądania


118

Używam sklepu PHP , ExtJS i Ajax .

Wysyła dane (o tworzeniu, aktualizowaniu, niszczeniu) nie w POST ani GET. W konsoli Chrome moje parametry wychodzące są widoczne jako JSON w polu „ Request Payload ”. $ _POST i $ _GET są puste.

Jak go odzyskać w PHP?

Odpowiedzi:


257

Jeśli dobrze rozumiem sytuację, zamiast application/x-www-form-urlencodeddanych przesyłasz dane json przez treść http .

Możesz pobrać te dane za pomocą tego fragmentu:

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

Jeśli przechodzisz json, możesz zrobić:

$data = json_decode($request_body);

$data następnie zawiera dane json w tablicy php.

php://inputjest tak zwanym opakowaniem .

php: // input to strumień tylko do odczytu, który umożliwia odczyt surowych danych z treści żądania. W przypadku żądań POST lepiej jest użyć php: // input zamiast $ HTTP_RAW_POST_DATA, ponieważ nie zależy to od specjalnych dyrektyw php.ini. Co więcej, w przypadkach, w których $ HTTP_RAW_POST_DATA nie jest wypełniane domyślnie, jest to potencjalnie mniej wymagająca ilość pamięci alternatywa dla aktywacji always_populate_raw_post_data. php: // wejście nie jest dostępne z enctype = "multipart / form-data".


2
Mógłbym odzyskać dane. Dzięki. !
nkuhta

7
Dziękuję bardzo! Szukałem tej odpowiedzi od dni i pomyślałem, że zwariowałem.
Zacho,

nagłówek to application / json
Angelin Nadar

@AngelinNadar Wtedy obowiązuje ta odpowiedź.
Ikke

Jeśli używasz Laravel, po prostu utwórz funkcję pomocniczą, która 1. pobiera ten ciąg i 2. json_decoduje go. Wtedy nie będzie się różnić od tablicy z Input :: all (); Z drugiej strony, to prawdopodobnie nie zadziałałoby również dla wszystkich innych.
Michael J. Calkins,

12

Możesz także skonfigurować extJ za writerpomocą i będzie on regularnie wysyłać dane (a zatem będziesz mógł pobierać dane przez i ).encode: true$_POST$_GET

... wartości zostaną wysłane jako część parametrów żądania, a nie jako nieprzetworzony wpis (za pośrednictwem dokumentacji do kodowania konfiguracji Ext.data.writer.Json)

AKTUALIZACJA

Doktorzy również mówią, że:

Opcja encode powinna być ustawiona na true tylko wtedy, gdy zdefiniowano root

Tak więc, prawdopodobnie, writer„s rootjest wymagane config.


@NikitaKuhta, czy ustawiłeś writerkonfigurację roota? Może to być wymagane. encodedziała dla mnie imageshack.us/f/32/20120308153201.png
Molecular Man
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.