file_get_contents ("php: // input") або $ HTTP_RAW_POST_DATA, який краще отримати тіло запиту JSON?


120

file_get_contents("php://input")або $HTTP_RAW_POST_DATA- який краще отримати частину запиту JSON?

І який тип запиту ( GETабо POST) я повинен використовувати для надсилання даних JSON під час використання клієнтської сторони XmlHTTPRequest?

Моє запитання було натхнене цією відповіддю: Як розмістити JSON на PHP з завитком

Цитата з цієї відповіді:

З точки зору протоколу file_get_contents("php://input")насправді правильніше, оскільки ви насправді не обробляєте дані багаточастинної форми http.

Відповіді:


195

Насправді php://inputдозволяє читати необроблені дані POST.

Це менш об'ємна пам'ять, альтернатива $ HTTP_RAW_POST_DATA і не потребує спеціальних директив php.ini .

php://inputнедоступний для enctype="multipart/form-data".

Довідка: http://php.net/manual/en/wrappers.php.php


12
Крім того, станом на PHP 5.6 $HTTP_RAW_POST_DATAвважається застарілим і php://inputможе бути використаний повторно.
Кріс Форренс


json_decode (file_get_contents ('php: // input'), true) підтримує це в PHP 7.1, щоб отримати значення $ _GET з URL?
Кайлас

$ HTTP_RAW_POST_DATA застаріло з PHP 7
Даніель,

15

php: // input - це потік лише для читання, який дозволяє читати необроблені дані з тіла запиту. У випадку запитів POST бажано використовувати php: // input замість $ HTTP_RAW_POST_DATA, оскільки це не залежить від спеціальних директив php.ini . Більше того, для тих випадків, коли $ HTTP_RAW_POST_DATA не заповнений за замовчуванням, це потенційно менш об'ємна пам'ять, альтернатива активації завжди_populate_raw_post_data.

Джерело: http://php.net/manual/en/wrappers.php.php .


4
Крім того, станом на PHP 5.6 $HTTP_RAW_POST_DATAвважається застарілим і php://inputможе бути використаний повторно.
Кріс Форренс

14

file_get_contents (php: // input) - отримує необроблені дані POST, і вам потрібно використовувати це, коли ви пишете API та потрібен XML / JSON / ... вхід, який неможливо розшифрувати на PHP $ _POST, наприклад:

надіслати поштою 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'));

3

Для того, як ви надсилаєте запит, повинні застосовуватися звичайні правила. Якщо запит - це отримати інформацію (наприклад, результат «натяку» на частковий пошук, або відобразити нову сторінку тощо), ви можете скористатися GET. Якщо дані, що надсилаються, є частиною запиту змінити щось (оновити базу даних, видалити запис тощо), тоді використовуйте POST.

На стороні сервера немає причин використовувати необроблений вхід, якщо ви не хочете схопити весь блок публікації / отримати дані за один раз. Ви можете отримати конкретну інформацію, яку ви хочете, за допомогою масивів _GET / _POST, як зазвичай. Бібліотеки AJAX, такі як MooTools / jQuery, оброблять важку частину виконання фактичних викликів AJAX та кодування даних форм у відповідний для вас формат.


Це суть: я хочу схопити весь блок публікації / отримати дані за один раз, тому що JSON - це формат, який не змінюється, він відображає лише дані.
Мануель Бітто

@Kucebe Я не бачу, чому це потрібно, чому б не помістити дані JSON у поле POST і не зробити це з ним?
Pekka

Якщо ви хочете весь блок JSON, то чому б не призначити текстовий блок JSON полі форми та подати його таким чином? <input type="hidden" name="data" value="json data here" />цілком прийнятний і дозволяє тривіально отримати його на стороні сервера за допомогою $ _REQUEST ['data'].
Марк Б

3
Вбудовування JSON у поле POST розбиває мету тегів типу вмісту HTTP, і не так приємно для налагодження у налагоджувачах Fiddler та браузерах (які можуть зрозуміти JSON). Крім того, багато сторонніх бібліотек JavaScript POST JSON корисні навантаження як application / json.
CyberMonk

2

Для даних JSON набагато простіше розмістити їх як тип вмісту "application / json". Якщо ви використовуєте GET, вам доведеться кодувати URL-адресу JSON в параметрі, і це щось безладно. Крім того, немає обмежень розміру, коли ви робите POST. Розмір GET, якщо дуже обмежений (максимум 4 К).


2
Існує часто обмеження розміру для POST, але воно зазвичай встановлюється досить високим. Перевірте своє php.ini.
Бред

2

Ваше друге питання просте: GET має обмеження розміру на 1-2 кілобайти як на сервері, так і на стороні веб-переглядача, тому будь-які великі обсяги даних вам доведеться надсилати через POST.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.