XMLHttpRequest无法发送POST数据

9

我想通过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正在工作", user:myUser, pass:myPass} 但实际上只收到了这个: {msg: "PHP正在工作", user:null, pass:null}
正如你所看到的,PHP $_POST无法捕获我发送的POST数据,而只是返回null。是什么出了问题??

你的网络控制台传递了哪些数据? - Masivuye Cokile
我建议使用"axios"进行ajax请求,它比纯JavaScript更好。 - bill.gates
2个回答

10
问题出在您的Content-Type上。如果您使用application/json,PHP将不会将post数据解析为$_POST变量。您需要将它们发送为表单数据,以便PHP对其进行解析。
查看此问题以获取更多信息:使用XMLHttpRequest发送POST数据 或者您可以使用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没有捕获到任何内容... - Jorge del Campo Andrade
我已经为file_get_contents方法添加了一个适合我的示例代码。你还需要使用JSON.stringify()将数据转换为字符串。 - Michal Hynčica
嗨Michal,只有一个问题。为什么使用$.post(jquery)可以将POST数据发送到PHP,但使用XMLHttpRequest json却不行? - Jorge del Campo Andrade
这是由于数据发送到服务器的方式不同。JQuery的$.post将数据作为“application/x-www-form-urlencoded”发送,而不是json,这就是为什么php将接收到的数据解析为“$_POST”变量的原因。您还可以使用“XMLHTtpRequest”以“application/x-www-form-urlencoded”发送请求,并且您将能够在“$_POST”中找到数据。请参阅我在答案中链接的问题,了解如何执行此操作。 - Michal Hynčica
谢谢Michael!现在我明白了您提供的链接页面。 :) - Jorge del Campo Andrade

4

在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?我尝试了您的代码,但没有任何效果。 - Jorge del Campo Andrade
$request只是一个变量。我认为既然你正在接收请求,那么$request的名称就是正确的。顺便问一下,你在网络控制台中看到发送的任何数据吗? - Aakash Tushar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接