XMLHttpRequest 不发送 POST 数据

Jor*_*ade 9 javascript php ajax post json

我尝试使用 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);
Run Code Online (Sandbox Code Playgroud)

我的 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}
Run Code Online (Sandbox Code Playgroud)

我期望这样的响应:{msg:“PHP正在工作”,用户:myUser,pass:myPass}但只需接收:{msg:“PHP正在工作”,用户:null,pass:null}

正如您所看到的,PHP $_POST 无法捕获我发送的帖子数据,只能返回 null。穿什么??

Mic*_*ica 10

问题出在您的内容类型中。如果您使用application/jsonPHP,则不会将发布数据解析为 $_POST 变量。您必须将它们作为表单数据发送才能让 PHP 解析它。

有关详细信息,请参阅此问题使用 XMLHttpRequest 发送 POST 数据

或者,您可以使用file_get_contents("php://input")来获取 HTTP 请求的原始正文并使用 .json 解析 json json_decode

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);
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

JSON.stringify请注意,在将数据对象作为参数传递给方法之前,您需要先获取数据对象send()。否则数据无法正确发送。