Начал изучать php/ajax, хочу разобраться в этих тонкостях при отправке post. Если отправляю тело в кодировке urlencoded и multipart/form-data, то в php $_REQUEST заполняется тем, чем надо. А вот в теле отправляю строку json, то $_REQUEST пуст, но они есть в $GLOBALS["HTTP_RAW_POST_DATA"] и "
php://input". Правильно ли я понимаю, что при отправке json $_REQUEST всегда будет пуст. Если да, то откуда лучше извлекать данные $GLOBALS["HTTP_RAW_POST_DATA"] или "
php://input".
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" type="text/css" href="style.css">
<title>Php</title>
</head>
<body>
<div class="cont">
<form method="POST" action="script.php">
<input type="text" name="fname" value="Igor">
<input type="text" name="lname" value="Ivanov">
<input type="submit" name="send" value="send">
</form>
<div class="response">
</div>
<script>
var form = document.forms[0];
var send = form.elements.send;
send.addEventListener('click', function(e) {
e.preventDefault();
//var data = new FormData(form); // (1) все окей
//var data = 'fname=Igor&lname=Ivanov'; // (2) тоже все ок
//var data = "--random\r\nContent-Disposition: form-data; name='fname'\r\n\r\nIgor\r\n--random\r\nContent-Disposition: form-data; name='lname'\r\n\r\nIvanov\r\n--random--"; // (3) и тут норм
var data = JSON.stringify({
fname: 'Igor',
lname: 'Ivanov'
}); // (4)
var xhr = new XMLHttpRequest;
xhr.onreadystatechange = function() {
if(xhr.readyState == 4 && xhr.status == 200) {
var resp = xhr.responseText;
console.log(resp);
document.getElementsByClassName('response')[0].innerHTML = resp;
}
}
xhr.open('POST', 'script.php', true);
// xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); // (2)
// xhr.setRequestHeader('Content-Type', 'multipart/form-data; boundary=random'); // (3)
xhr.setRequestHeader('Content-Type', 'application/json; charset=utf-8'); // (4)
xhr.send(data);
});
</script>
</body>
</html>
<?php
echo '1)$_REQUEST ----- ';
echo var_dump($_REQUEST).'<br>';
echo '2)$GLOBALS[HTTP_RAW_POST_DATA] ----- ';
echo var_dump($GLOBALS["HTTP_RAW_POST_DATA"]).'<br>';
echo '3)php://input ----- ';
echo file_get_contents("php://input");
?>