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

问题描述:

我想从JavaScript使用XMLHttpRequest和Json字符串发送一小部分数据到一个PHP脚本来处理它,并再次以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秒美洲/墨西哥城] PHP推荐使用:自动填充$ HTTP_RAW_POST_DATA已弃用,将在未来版本中删除。为避免此警告,在php.ini中将'always_populate_raw_post_data'设置为'-1',并改为使用php://输入流。在未知在线0

[09-JAN-2015 15时50分03秒美洲/墨西哥城] PHP的警告:不能更改头信息 - 在未知已经发出已上线0

当然,和头响应文字是这样的:

弃用:自动填充$ HTTP_RAW_POST_DATA已取消,将在未来的版本中删除。为避免此警告,在php.ini中将'always_populate_raw_post_data'设置为'-1',并改为使用php://输入流。在未知在线

警告:无法修改标题信息 - 在未知已经发出已上线头
{ “富”: “1”, “酒吧”:” 2 “}”

什么我做错了什么?为什么PHP抱怨已经发送了头?

我使用PHP 5.6

+4

我建议你开始使用jQuery来做ajax。我已经忘记了如何以手动的方式做到这一点,我很高兴我做到了。 – developerwjk 2015-01-09 22:10:57

+0

加上一个给developerwjk,如果你坚持这样做,只需按照以下回答说的话:D,打开php.ini并将'always_populate_raw_post_data'设置为-1 – 2015-01-09 22:12:35

+2

但是,你得到的错误是因为'$ json = file_get_contents('php:// input');'你不能再使用'php:// input'。你必须把你的json放在一个请求参数中,然后用'$ _POST'读这个参数。 – developerwjk 2015-01-09 22:12:55

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

+0

好吧,所以我明白这个警告是因为默认行为是自动填充数据,现在在5.6中,有必要明确指出PHP应该总是填充原始数据_并且不推荐使用的是自动假设您想要填充原始数据_ , 我对吗? – arielnmz 2015-01-14 15:44:44

+0

@arielnmz:PHP 5.6之前的默认设置是当它获得了一个MIME类型并且通过POST无法识别时填充原始数据。在PHP 5.6+中,不建议填充原始数据。它不应该被完成。将ini值设置为-1会告诉PHP *从不*这样做。 ini值为1:始终为0,仅当未识别MIME时,-1:从不。 – 2015-01-14 15:56:00

+0

所以警告出现了,因为我没有这样的设置,对吧? – arielnmz 2015-01-14 16:01:11

我看了看我的一些旧代码,不会做不阿贾克斯jQuery的。在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()