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?

nkuhta
źródło

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".

Ikke
źródło
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.

Molecular Man
źródło
@NikitaKuhta, czy ustawiłeś writerkonfigurację roota? Może to być wymagane. encodedziała dla mnie imageshack.us/f/32/20120308153201.png
Molecular Man