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 с помощью curl

Цитата из этого ответа:

С точки зрения протокола file_get_contents("php://input")это на самом деле более правильно, поскольку вы все равно не обрабатываете данные многостраничной формы http.

Мануэль Битто
источник

Ответы:

196

Фактически php://inputпозволяет читать необработанные данные POST.

Это менее требовательная к памяти альтернатива $ HTTP_RAW_POST_DATA и не требует каких-либо специальных директив php.ini .

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

Ссылка: http://php.net/manual/en/wrappers.php.php

ZAF
источник
12
Кроме того, начиная с PHP 5.6 $HTTP_RAW_POST_DATAон считается устаревшим и php://inputможет использоваться повторно.
Крис Форренс
Также см enable_post_data_reading.
Pacerier
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 не заполняется по умолчанию, это потенциально менее ресурсоемкая альтернатива активации always_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 / ..., который не может быть декодирован в $ _POST с помощью PHP, например:

отправить по почте 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
источник
3

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

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

Марк Б
источник
В этом суть: я хочу получить весь блок данных post / get за один раз, потому что JSON - это формат без переменных, он представляет только данные.
Мануэль Битто
@Kucebe Я не понимаю, почему это необходимо, почему бы не поместить данные JSON в поле POST и не покончить с этим?
Pekka
Если вам нужен весь блок JSON, то почему бы не назначить текстовый блок JSON полю формы и не отправить его в таком виде? <input type="hidden" name="data" value="json data here" />вполне приемлемо и позволяет вам получить его тривиально на стороне сервера с помощью $ _REQUEST ['data'].
Marc B
3
Встраивание JSON в поле POST лишает смысла тега типа содержимого HTTP и не так удобно для отладки в Fiddler и отладчиках браузера (которые могут понимать JSON). Кроме того, многие сторонние библиотеки JavaScript отправляют полезные нагрузки JSON как application / json.
CyberMonk
2

Для данных JSON намного проще отправить их как тип содержимого «application / json». Если вы используете GET, вам нужно URL-кодировать JSON в параметре, и это немного беспорядочно. Кроме того, при выполнении POST ограничений по размеру нет. Размер GET, если он очень ограничен (максимум 4K).

ZZ Coder
источник
2
Часто существует ограничение на размер для POST, но обычно оно устанавливается довольно высоким. Проверьте свой php.ini.
Brad
2

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

Пекка
источник