XMLHttpRequest 不发送 POST 数据
Posted
技术标签:
【中文标题】XMLHttpRequest 不发送 POST 数据【英文标题】:XMLHttpRequest not sending POST data 【发布时间】:2020-02-01 16:49:09 【问题描述】:我尝试使用 XMLHttpRequest 将 POST 数据发送到 php 文件。 URL 是正确的,但 PHP 无法捕获任何发送的数据,只能返回一个空响应。
我在客户端使用纯 javascript,在服务器上使用 PHP 7.1
我的 PHP:
$data->msg = 'PHP is working';
$data->user = $_POST['user'];
$data->pass = $_POST['pass'];
echo json_encode($data);
我的 Javascript:
var data = 'user': 'myUser', 'pass': 'myPass' ;
var xhr = new XMLHttpRequest();
xhr.open('POST', 'myurl', true);
xhr.setRequestHeader("Content-Type", "application/json; charset=UTF-8");
xhr.onreadystatechange = function ()
if (xhr.readyState === 4 && xhr.status === 200)
var res = JSON.parse(xhr.response);
console.log(res);
;
xhr.send(data);
// Expected output: msg: "PHP is working", user: myUser, pass: myPass
// But just recive: msg: "PHP is working", user: null, pass: null
我希望得到这样的响应:msg: "PHP is working", user: myUser, pass: myPass 但只需接收:msg: "PHP is working", user: null, pass: null
如您所见,PHP $_POST 无法捕获我发送的帖子数据并返回 null。穿什么??
【问题讨论】:
您的网络控制台上正在传递什么数据? 我建议对 ajax 请求使用“axios”,它比普通的 javascript 更好 【参考方案1】:问题在于您的 Content-Type。如果您使用application/json
,PHP 不会将发布数据解析为 $_POST 变量。您必须将它们作为表单数据发送给 PHP 解析它。
更多信息请参阅此问题Send POST data using XMLHttpRequest
您也可以使用file_get_contents("php://input")
获取HTTP 请求的原始正文并使用json_decode
解析json。
file_get_contents 和 json_decode 示例
PHP 代码:
$in = file_get_contents('php://input');
$decoded = json_decode($in, true);
$data = new stdClass();
$data->msg = 'PHP is working';
$data->user = $decoded['user'];
$data->pass = $decoded['pass'];
echo json_encode($data);
JS代码:
var data = 'user': 'myUser', 'pass': 'myPass' ;
var xhr = new XMLHttpRequest();
xhr.open('POST', 'myUrl', true);
xhr.setRequestHeader("Content-Type", "application/json; charset=UTF-8");
xhr.onreadystatechange = function ()
if (xhr.readyState === 4 && xhr.status === 200)
var res = JSON.parse(xhr.response);
console.log(res);
;
xhr.send(JSON.stringify(data));
return false;
请注意,在将数据对象作为参数传递给send()
方法之前,您需要先JSON.stringify
。否则数据发送不正确。
【讨论】:
嗨 Michal,我正在尝试使用 file_get_contents("php://input") 但输出仍然为空。似乎 PHP 什么都抓不到…… 我添加了适用于我的file_get_contents
方法的示例代码。您还需要使用JSON.stringify()
将数据转换为字符串。
嗨,Michal,还有一个问题。为什么使用 $.post (jquery) 可以将 POST 数据发送到 PHP,但不能使用 XMLHttpRequest json?
这是因为数据是如何发送到服务器的。 JQuery 的 $.post 以 application/x-www-form-urlencoded
而不是 json 的形式发送数据,这就是 php 将收到的数据解析为 $_POST
变量的原因。您也可以将XMLHTtpRequest
的请求发送为application/x-www-form-urlencoded
,您将能够在$_POST
中找到数据。请参阅我在答案中链接的问题,了解如何做到这一点。
谢谢迈克尔!现在有了这个解释,我理解了你链接的页面。 :)【参考方案2】:
要在 php 中接收 json,您需要阅读请求正文:
$request = json_decode(file_get_contents('php://input'), true);
$data->msg = 'PHP is working';
$data->user = $request['user'];
$data->pass = $request['pass'];
echo json_encode($data);
【讨论】:
嗨,我不明白。为什么是 $request ?我试过你的代码,但没有$request
只是一个变量。我想既然你收到了请求,$request
的名字是对的。顺便说一句,您在网络控制台中看到正在发送的任何数据吗?以上是关于XMLHttpRequest 不发送 POST 数据的主要内容,如果未能解决你的问题,请参考以下文章
Axios/XMLHttpRequest 在生产环境中发送 GET 而不是 POST