file_get_contents („php: // input”) czy $ HTTP_RAW_POST_DATA, który z nich jest lepszy, aby uzyskać treść żądania JSON?

120

file_get_contents("php://input")lub $HTTP_RAW_POST_DATA- który z nich jest lepszy, aby uzyskać treść żądania JSON?

I jakiego typu żądania ( GETlub POST) powinienem użyć do wysyłania danych JSON po stronie klienta XmlHTTPRequest?

Moje pytanie zostało zainspirowane tą odpowiedzią: Jak wysłać JSON do PHP za pomocą curl

Cytuj z tej odpowiedzi:

Z punktu widzenia protokołu file_get_contents("php://input")jest to bardziej poprawne, ponieważ tak naprawdę nie przetwarzasz danych formularza wieloczęściowego http.

Manuel Bitto
źródło

Odpowiedzi:

195

Właściwie php://inputpozwala na odczyt surowych danych POST.

Jest to mniej wymagająca ilości pamięci alternatywa dla $ HTTP_RAW_POST_DATA i nie wymaga żadnych specjalnych dyrektyw php.ini .

php://inputnie jest dostępny z enctype="multipart/form-data".

Źródła: http://php.net/manual/en/wrappers.php.php

zaf
źródło
12
Ponadto od wersji PHP 5.6 $HTTP_RAW_POST_DATAjest uważany za przestarzały i php://inputmoże być ponownie użyty.
Chris Forrence,
Zobacz także enable_post_data_reading.
Pacerier,
json_decode (file_get_contents ('php: // input'), true) czy to obsługuje w PHP 7.1 pobieranie wartości $ _GET z adresu URL?
Kailas,
$ HTTP_RAW_POST_DATA jest przestarzałe od PHP 7
Daniel
15

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 pamięć alternatywa dla aktywacji always_populate_raw_post_data.

Źródło: http://php.net/manual/en/wrappers.php.php .

Zeeshan Hyder
źródło
4
Ponadto od wersji PHP 5.6 $HTTP_RAW_POST_DATAjest uważany za przestarzały i php://inputmoże być ponownie użyty.
Chris Forrence,
14

file_get_contents (php: // input) - pobiera surowe dane POST i musisz ich użyć, gdy piszesz API i potrzebujesz XML / JSON / ... wejścia, którego nie można zdekodować do $ _POST przez PHP jakiś przykład:

wyślij pocztą Ciąg JSON

<input type="button" value= "click" onclick="fn()">
<script>
 function fn(){


    var js_obj = {plugin: 'jquery-json', version: 2.3};

    var encoded = JSON.stringify( js_obj );

var data= encoded


    $.ajax({
  type: "POST",
  url: '1.php',
  data: data,
  success: function(data){
    console.log(data);
  }

});

    }
</script>

1.php

//print_r($_POST); //empty!!! don't work ... 
var_dump( file_get_contents('php://input'));
zloctb
źródło
3

Powinny obowiązywać zwykłe zasady dotyczące sposobu wysyłania wniosku. Jeśli żądanie ma na celu pobranie informacji (np. Częściowy wynik wyszukiwania „podpowiedź” lub nowa strona do wyświetlenia itp.), Możesz użyć GET. Jeśli wysyłane dane są częścią prośby o zmianę (aktualizacja bazy danych, usunięcie rekordu itp.), Użyj POST.

Po stronie serwera nie ma powodu, aby używać surowych danych wejściowych, chyba że chcesz pobrać cały blok danych post / get za jednym razem. Możesz pobrać określone informacje, które chcesz, za pomocą tablic _GET / _POST, jak zwykle. Biblioteki AJAX, takie jak MooTools / jQuery, zajmą się trudną częścią wykonywania rzeczywistych wywołań AJAX i kodowania danych formularzy do odpowiednich formatów.

Marc B.
źródło
O to chodzi: chcę pobrać cały blok danych post / get za jednym razem, ponieważ JSON jest formatem bez zmiennych, przedstawia tylko dane.
Manuel Bitto
@Kucebe Nie rozumiem, dlaczego jest to konieczne, dlaczego nie umieścić danych JSON w polu POST i skończyć z tym?
Pekka
Jeśli chcesz mieć cały blok JSON, dlaczego nie przypisać bloku tekstu JSON do pola formularza i przesłać go w ten sposób? <input type="hidden" name="data" value="json data here" />jest całkowicie akceptowalny i pozwala w trywialny sposób pobrać go po stronie serwera za pomocą $ _REQUEST ['data'].
Marc B
3
Osadzanie JSON w polu POST jest sprzeczne z przeznaczeniem tagu typu zawartości HTTP i nie jest tak przyjemne do debugowania w programie Fiddler i debugerach przeglądarki (które mogą rozumieć JSON). Ponadto wiele bibliotek JavaScript innych firm POST JSON ładuje jako application / json.
CyberMonk
2

W przypadku danych JSON znacznie łatwiej jest POST jako typ zawartości „application / json”. Jeśli używasz GET, musisz zakodować URL JSON w parametrze i jest to trochę bałaganiarskie. Ponadto nie ma limitu rozmiaru podczas wykonywania POST. UZYSKAJ rozmiar, jeśli jest bardzo ograniczony (maksymalnie 4K).

ZZ Coder
źródło
2
Często istnieje limit rozmiaru dla POST, ale zwykle jest on ustawiony dość wysoko. Sprawdź swoje php.ini.
Brad
2

Twoje drugie pytanie jest łatwe, GET ma ograniczenie rozmiaru do 1-2 kilobajtów zarówno po stronie serwera, jak i przeglądarki, więc wszelkiego rodzaju większe ilości danych, które musiałbyś wysłać przez POST.

Pekka
źródło