Показать сообщение отдельно
  #16 (permalink)  
Старый 22.11.2019, 05:53
Профессор
Отправить личное сообщение для laimas Посмотреть профиль Найти все сообщения от laimas
 
Регистрация: 14.01.2015
Сообщений: 12,990

Сохраните это код под любым именем и запустите его.

<?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); и попробуйте после этого, затем попробуйте с переносом всего РНР кода в середину/конец страницы. Разве не понятно почему в последних случаях на клиенте будет хрень, а не то что ожидалось?

Последний раз редактировалось laimas, 22.11.2019 в 06:57.
Ответить с цитированием