Причина в том, что php://input
возвращает все необработанные данные после HTTP-заголовков запроса, независимо от типа содержимого.
Суперглобальный PHP $_POST
, предполагается, что только Обтекание данных:
application/x-www-form-urlencoded
(стандартный тип контента для простых форм-публикаций) или multipart/form-data-encoded
(в основном используется для загрузки файлов)
Это потому, что это единственные типы контента, которые должны поддерживаться пользовательскими агентами .Таким образом, сервер и PHP традиционно не ожидают получения какого-либо другого типа контента (что не означает, что они не могут).
Так что, если вы просто отправляете старый добрый HTML form
, запросвыглядит примерно так:
POST /page.php HTTP/1.1
key1=value1&key2=value2&key3=value3
Но если вы много работаете с Ajax, эта проба также включает обмен более сложными данными с типами (string, int, bool) и структурами (массивами, объектами), поэтомув большинстве случаев JSON - лучший выбор.Но запрос с JSON-полезной нагрузкой выглядел бы примерно так:
POST /page.php HTTP/1.1
{"key1":"value1","key2":"value2","key3":"value3"}
Теперь содержимое будет application/json
(или, по крайней мере, ни один из вышеперечисленных), поэтому PHP-$_POST
-wrapper не делаетне знаю, как справиться с этим (пока).
Данные все еще там, вы просто не можете получить к ним доступ через обертку.Поэтому вам нужно получить его самостоятельно в необработанном формате с помощью file_get_contents('php://input')
(, если он не multipart/form-data
-кодирован ).
Это также способ доступа к XML-данным или любому другому нестандартному типу контента.