file_get_contents ("php: // input") или $ HTTP_RAW_POST_DATA, какой из них лучше получить тело запроса JSON? - PullRequest
102 голосов
/ 28 апреля 2010

file_get_contents("php://input") или $HTTP_RAW_POST_DATA - какой из них лучше получить тело запроса JSON?

И какой тип запроса (GET или POST) следует использовать для отправки данных JSON при использовании клиентской стороны XmlHTTPRequest?

Мой вопрос был вдохновлен этим ответом: Как опубликовать JSON в PHP с помощью curl

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

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

Ответы [ 6 ]

178 голосов
/ 28 апреля 2010

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

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

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

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

12 голосов
/ 23 февраля 2013

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.

9 голосов
/ 20 октября 2015

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

отправить по почте JSON string

<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 голосов
/ 28 апреля 2010

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

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

2 голосов
/ 28 апреля 2010

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

2 голосов
/ 28 апреля 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...