【问题标题】:What is the correct way to send a JSON string between javascript and PHP?在 javascript 和 PHP 之间发送 JSON 字符串的正确方法是什么?
【发布时间】:2015-01-09 22:09:29
【问题描述】:

我正在尝试使用 XMLHttpRequest 和 Json 字符串从 javascript 发送一点点数据到 PHP 脚本来处理它并再次以 Json 字符串的形式返回一些响应,但是我遇到了很多问题以及无法正常工作的不同方法,以下是迄今为止有效的方法:

客户

json_string = '{"foo":"1","bar":"2"}';

var r = new XMLHttpRequest();
r.open('post', 'script.php', true);
r.setRequestHeader('Content-type','application/json; charset=utf-8');
r.setRequestHeader('Content-length', json_string.length);
r.setRequestHeader('Connection', 'close');
r.onload = function () {
    console.log(this.responseText);
};
r.send(json_string);

服务器

$json = file_get_contents('php://input');

echo $json;

没有比这更简单的了,但是我收到了这个警告:

[09-Jan-2015 15:50:03 America/Mexico_City] PHP 已弃用:自动填充 $HTTP_RAW_POST_DATA 已弃用,并将在未来版本中删除。为避免此警告,请在 php.ini 中将 'always_populate_raw_post_data' 设置为 '-1' 并改用 php://input 流。在第 0 行的未知中

[09-Jan-2015 15:50:03 America/Mexico_City] PHP 警告:无法修改标头信息 - 标头已在第 0 行的未知中发送

当然,响应文本如下所示:

已弃用:自动填充 $HTTP_RAW_POST_DATA 已弃用,并将在未来版本中删除。为避免此警告,请在 php.ini 中将 'always_populate_raw_post_data' 设置为 '-1' 并改用 php://input 流。在 0

警告 行的 Unknown 中:无法修改标头信息 - Unknown中已发送标头>上线0
{"foo":"1","bar":"2"}"

我做错了什么?为什么 PHP 会抱怨已经发送的 headers?

我使用的是 PHP 5.6。

【问题讨论】:

  • 我建议你开始使用 jquery 来做 ajax。我已经忘记了如何手动操作,我很高兴我做到了。
  • 然而,你得到的错误是因为$json = file_get_contents('php://input'); 你不能再使用php://input。您必须将 json 放入请求参数中并使用 $_POST 读取该参数。
  • @developerwjk 如此多的错误信息和薄弱的建议。有人可能想要使用原生 JS 的原因有一百万零一个。 You can't use php://input anymore - 解释 that 的含义。我今天用过。\
  • @developerwjk: php://input正确的使用方法。
  • @arielnmz:在这种情况下,您需要让您的托管服务提供商更新 php.ini 文件。 PHP 的设置不正确,应该是他们的工作来修复它!如果他们不修复它,我建议寻找其他托管服务。

标签: javascript php json


【解决方案1】:

您需要编辑您的 php.ini 文件并设置always_populate_raw_post_data = -1

您的代码运行良好。 $json = file_get_contents('php://input'); 是正确的。

您只是收到一条警告,因为您的 PHP 已更新,您需要为该新版本更新 php.ini 文件。

更多信息在这里:https://www.bram.us/2014/10/26/php-5-6-automatically-populating-http_raw_post_data-is-deprecated-and-will-be-removed-in-a-future-version/

【讨论】:

  • 好的,所以我知道警告是因为默认行为是自动填充数据,现在在 5.6 中需要明确指出 PHP 应该始终填充原始数据 不推荐使用的是自动假设您想要始终填充原始数据,对吗?
  • @arielnmz:PHP 5.6 之前的默认设置是在通过 POST 获得无法识别的 MIME 类型时填充原始数据。在 PHP 5.6+ 中,不推荐使用填充原始数据。永远不应该这样做。将 ini 值设置为 -1 会告诉 PHP 从不 这样做。 ini 值为 1:总是,0:仅当 MIME 不被识别时,-1:从不。
  • 所以警告出现是因为我没有设置这样的设置,对吧?
  • @arielnmz:正确。默认设置为always_populate_raw_post_data = 0。 PHP 5.6 希望它被设置为-1,所以它会抛出一个警告。
  • 好吧,总结一下:警告是因为将always_populate_raw_post_data 设置为0(或不明确设置)已被弃用,但通过php://input 接收输入仍然有效对吧?
【解决方案2】:

我查看了一些在没有 Jquery 的情况下执行 Ajax 的旧代码。在 POST 参数中发送 Json 与您已经在做的没有什么不同。

你真的只需要改变你正在设置的标题,并给它一个参数名称:

json_string = '{"foo":"1","bar":"2"}';

var r = new XMLHttpRequest();
r.open('post', 'script.php', true);
r.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
r.onload = function () {
    console.log(this.responseText);
};
r.send('json='+encodeURIComponent(json_string));

然后,当然是在 PHP 中:

$_POST['json']

编辑:添加encodeURIComponent()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-10-09
    • 1970-01-01
    • 2018-03-24
    • 2018-09-22
    • 1970-01-01
    • 2019-09-13
    • 1970-01-01
    相关资源
    最近更新 更多