Когда я отправляю данные POST на свой сервер, используя обычную старую форму отправки, я могу извлечь эти данные из переменной $_POST, но когда POST отправляет данные JSON через AJAX, мне нужно получить к ним доступ через file_get_contents('php://input'). Это почему? В обоих случаях я использую метод POST, есть ли какие-то явные заголовки, которые я должен установить для моего вызова AJAX? Я когда-либо сталкивался с этой проблемой только на текущем сервере разработки и никогда раньше не использовал file_get_contents('php://input'). Есть где-нибудь настройка сервера? Могу ли я изменить это поведение с помощью .htaccess?
вы можете настроить некоторые заголовки, чтобы они заполняли $ _POST, но не можете вспомнить, какие именно. (извините, не очень полезно)
Возможно, тип содержимого для запроса POST отличался от application/x-www-form-urlencoded и multipart/form-data. Может быть, это был application/json. Тогда PHP не будет заполнять $_POST.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Добавьте это в начало вашего .php файла:
$_POST = json_decode(file_get_contents("php://input"), true);
так что содержимое будет декодировано и доступно. После этого вы можете получить доступ к отдельным ключам как обычно.
Я делал это, но хочу знать Зачем. И почему мне не приходилось этого делать раньше.
@AbrahamBrookes Насколько я понимаю, это просто потому, что полезная нагрузка - это JSON, и чтобы правильно создать массив POST, JSON должен быть декодирован.
Итак, насколько мне удалось выяснить, это как-то связано со способом получения данных сервером - PHP не может изначально анализировать JSON. Отправка простых старых объектов JSON из Javascript в PHP приведет к тому, что PHP не будет знать, что делать с типом данных, и, следовательно, не сможет предварительно заполнить соответствующие глобальные переменные.
Чтобы обойти это, я добавил проверку в свою функцию-оболочку ajax, которая перехватывает JSON, кодирует как объект FormData и вместо этого отправляет его на сервер.
Здесь может быть полезная информация, даже если вы не используете angular: stackoverflow.com/questions/15485354/…