【问题标题】:Why does jQuery.post end up in PHP's $_POST, and my vanilla JS post does not?为什么 jQuery.post 最终出现在 PHP 的 $_POST 中,而我的原版 JS 帖子却没有?
【发布时间】:2015-03-01 01:23:42
【问题描述】:

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

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

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

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

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

【问题讨论】:

  • 如果你想使用$_POST,那么你需要发送application/x-www-form-urlencoded header,而不是application/json
  • 我认为最好的办法是将其作为 JSON 发送,并使用json_decode(file_get_contents("php://input")) 而不是 $_POST。这实际上只是一种偏好,但在我看来,发送 JSON 更有意义,因为它比 $POST 变量更具表现力。
  • 我可能会在不同的情况下这样做@Juan Mendes,但我使用的是 PHP 框架 Slim,如果我使用 json,它不会在 $app->post 处理程序中获取我的 post 变量,所以这就是为什么我要问如何获取正常的 $_POST 变量并仍然使用 json 编码来发送数据。

标签: javascript php jquery ajax post


【解决方案1】:

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

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

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

【讨论】:

  • 我认为解释一下 OP 将 JSON 作为 HTTP 请求的主体发送,而 jQuery 将对象转换为application/x-www-form-urlencoded,它不发送 JSON 会很有帮助
  • @adeneo,好吧!所以,我现在切换回application/x-www-form-urlencoded,并使用Url.urlEncode(data) 将我的数据作为有效负载发送,现在我在$_POST 中看到它们,但是我尝试发送的对象最终以字符串[object Object] 的形式发送。那么我应该JSON.stringify我希望发送的数据的各个值吗?
  • @Flion 没错,现在你正在发送Object.toString() 的结果,它在内部被调用,因为该函数需要一个字符串
猜你喜欢
  • 2022-09-27
  • 2014-07-26
  • 1970-01-01
  • 1970-01-01
  • 2015-01-05
  • 1970-01-01
  • 2018-08-28
  • 2022-01-19
  • 1970-01-01
相关资源
最近更新 更多