为什么 jQuery.post 最终会变成 PHP 的 _POST 美元,而我的香草 JS 帖子却没有


Why does jQuery.post end up in PHP's $_POST, and my vanilla JS post does not?

我正在使用vanilla JavaScript发送带有JSON数据的AJAX发布请求:

xhr.open(method, url,true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.send(JSON.stringify(data));

标头看起来不错,但在 PHP 中$_POST是空的。关于SO有几个相关的问题,比如这个,但他们都建议使用:

json_decode(file_get_contents("php://input"))

但是,如果我使用jQuery.post我的变量最终会变成$_POST,所以一定是可能的。我的问题是怎么做?我可能做错了什么?或者我可以改变什么?

这是因为 jQuery 将你传入的数据转换为表单格式的字符串,带有一个 application/x-www-form-urlencoded 标头,这是 PHP 识别并从中正确创建$_POST超全局的。

您的本机 XMLHttpRequest 将数据作为带有 application/json 标头的 JSON 格式的字符串发送,PHP 不会将其识别为表单数据,也不会从中创建$_POST数组。

在现代浏览器中,您可以使用formData来创建可以使用 ajax 发送并由 PHP 识别的有效表单数据