@sverhvova

Почему при отправке JSON через Ajax в массиве $_REQUEST пусто?

Начал изучать 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");
?>
  • Вопрос задан
  • 182 просмотра
Решения вопроса 1
@LemonFox
stateless mind
php.net/manual/ru/reserved.variables.httprawpostda...
Deprecared, удален в 7.0+

Суперглобальные массивы $_GET, $_POST, $_REQUEST будут работать только при application/x-www-form-urlencoded или multipart/form-data в заголовке Content-Type запроса HTTP.

php.net/manual/ru/reserved.variables.post.php

Используйте php://input
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы