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 数据的主要内容,如果未能解决你的问题,请参考以下文章

XMLHttpRequest不发送

XMLHttpRequest Post参数

Axios/XMLHttpRequest 在生产环境中发送 GET 而不是 POST

XmlHttpRequest CORS POST 未发送 cookie

XMLHttpRequest 发送 JS 对象

CORS XMLHttpRequest 使用 POST 将多部分表单数据发送到 Softlayer 对象存储失败