在javascript和PHP之间发送JSON字符串的正确方法是什么?

时间:2015-01-09 22:09:29

标签: javascript php json

我正在尝试使用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已弃用,将在以后的版本中删除。为了避免这种警告,请设置“always_populate_raw_post_data'到' -1'在php.ini中使用php://输入流代替。在第0行的未知中

     

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

当然,回复文字如下:

  

已弃用:自动填充$ HTTP_RAW_POST_DATA已弃用,将在以后的版本中删除。为了避免这种警告,请设置“always_populate_raw_post_data'到' -1'在php.ini中使用php://输入流代替。在 0 0 未知   
  警告:无法修改标题信息 - 已在 0 未知中发送的标题左侧   {"富":" 1"" BAR":" 2"}"

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

我正在使用PHP 5.6。

2 个答案:

答案 0 :(得分:5)

您需要编辑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/

答案 1 :(得分:1)

我查看了一些在没有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()