Какая разница между POST и raw POST в PHP вообще? - PullRequest
6 голосов
/ 04 июля 2010

У меня есть этот вопрос после прочтения ответа здесь , в чем разница?

Можно ли отправить необработанный POST с HTML?

Ответы [ 4 ]

24 голосов
/ 04 июля 2010

Мы можем разделить представления формы в трех случаях:

  1. Представления с типом содержимого application/x-www-form-urlencoded
  2. Представления с типом содержимого multipart/form-data
  3. Другие представления.

В случаях 1 и 3 $HTTP_RAW_POST_DATA содержит необработанные данные постов (кроме случаев, когда для параметра always_populate_raw_post_data установлено значение false, в этом случае $HTTP_RAW_POST_DATA пусто в случае 1), то есть данные в точности так, как их отправил клиент (обычно браузер).В случае 1 данные имеют такую ​​форму, как

key1=value1&key2=value2&key3[]=value3.1&key3[]=value3.2

PHP автоматически анализирует это, так что $_POST становится:

$_POST = array(
    "key1" => "value1",
    "key2" => "value2",
    "key3" => array("value3.1", "value3.2");
)

Содержимое необработанных данных также можетдоступ через php://input, даже в случае 1, когда always_populate_raw_post_data установлен на false.В частности, file_get_contents("php://input") дает те же данные, которые $HTTP_RAW_POST_DATA имеет или будет иметь.

В случае 3, в котором данные POST являются произвольными, $_POST будет пустым массивом, а $HTTP_RAW_POST_DATA всегда будетбыть заполненным.

Случай 2 особенный.В этом случае PHP проанализирует данные и $_POST получит содержимое полей, которые не являются загруженными файлами, но php://input и $HTTP_RAW_POST_DATA будут недоступны.

5 голосов
/ 04 июля 2010

$HTTP_RAW_POST_DATA будет содержать что-то вроде:

beans=cheese&spam=eggs&one=two

PHP разбивает это для вас и помещает в массив $_POST.Наивно, он делает что-то вроде этого:

$parts = explode('&', $HTTP_RAW_POST_DATA);
foreach ( $parts as $part ) {
    list($key, $value) = explode('=', $part, 2);
    $_POST[$key] = $value;
}

Используя JavaScript, который может быть встроен в HTML, вы можете размещать что угодно с AJAX .Примерно так:

var req = new XMLHttpRequest();
req.open('POST', 'http://www.example.com/my_url' true);
req.send('any data you want');

позволит вам размещать произвольные вещи на веб-сервере.

0 голосов
/ 04 июля 2010

$ _ POST - это ассоциативный массив входящих параметров POST. PHP создает это для вас из необработанного сообщения HTTP. Если вы хотите работать с необработанными данными POST самостоятельно (возможно, некоторые двоичные данные отправлены в POST), используйте $ HTTP_RAW_POST_DATA.

0 голосов
/ 04 июля 2010

_POST предполагает, что это значения формы application/x-www-form-urlencoded или multipart/form-data.HTTP_RAW_POST_DATA, если заполнено, является необработанной строкой.Вы также можете получить доступ к этому с помощью псевдо-URL php://input.Вы можете отправлять произвольные данные POST (например, XML, JSON, HTML), используя AJAX.

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