Сохраните это код под любым именем и запустите его.
<?php
if($_SERVER['REQUEST_METHOD'] == 'POST') {
$headers = getallheaders();
if($headers['Content-Type']=='application/json') {
$data = file_get_contents('php://input');
$obj = json_decode($data); //as object
$arr = json_decode($data, true); //as array
$out = 'Вы спрашивали об этом объекте:' . PHP_EOL . PHP_EOL . print_r($obj, true)
. PHP_EOL . 'и этом массиве:' . PHP_EOL . PHP_EOL . print_r($arr, true);
} else $out = 'Не надо ля-ля!';
exit($out);
}
?>
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
</head>
<body>
<p>Это результат GET запроса. Вы просили эту страницу, вы ее получили. Хотите сделать POST запрос и получить на него ответ: нажмите "Да".</p>
<button>Да</button>
<pre></pre>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js"></script>
<script type="text/javascript">
$('button').click(function() {
let person = {
name:"Vova",
last:"Nak",
age:18
};
$.ajax({
type: "POST",
url: location,
headers: {'Content-type': 'application/json'},
data: JSON.stringify(person),
success: function(d) {
$('pre').text(d).before('<p>А это результат асинхронного POST запроса:</p>');
}
})
})
</script>
</body>
</html>
Здесь переданный заголовок 'Content-type: application/json' сервер анализирует, и если тип соответствует ожиданиям, то выполняет получение и декодирование данных извне. А вы где-то увидели, скопировали, а для чего не понятно. В данном случае (принимаются сырые данные) сервер не обязан анализировать ничего, ибо он не в курсе чего вы ожидаете, поэтому анализ всего возлагается на разработчика. Вы же просто впустую выплевываете заголовки так как ими далее не интересуетесь. А ведь мало проверить только тип, заголовок можно подделать, а прислать все что угодно.
Запомните - прежде чем обменяться данными сервер с клиентом обмениваются "любезностями" посредством заголовков. Именно поэтому в РНР передавать заголовки нужно до любого вывода в браузер, иначе будет ошибка. А любой вывод, это даже один пробел до РНР тега, который предвещает весь код на странице.
Ситуация с обработкой пост-запросов, имеется ввиду все типы запросов к той же странице не ради всего ее контента, такая же как и с заголовками - обработка должна предвещать код на странице. Иначе клиент на свой запрос получит совсем не то, что ожидает, а в случае если тип данных обмена JSON это вызовет ошибки на клиенте.
Запустите страницу - ответом будет определенное обработчиком POST запроса. Затем закомментируйте exit($out); и попробуйте после этого, затем попробуйте с переносом всего РНР кода в середину/конец страницы. Разве не понятно почему в последних случаях на клиенте будет хрень, а не то что ожидалось?