我在这里收到了很多信息,所以我想发布一个我发现的解决方案。
问题:从浏览器上的Javascript,服务器获取JSON数据,并让PHP成功解析它。
环境:在Windows上的浏览器(Firefox)中的Javascript。 LAMP服务器作为远程服务器:PHP 5.3.2在Ubuntu上。
什么工作(版本1):
1)JSON只是文本。文本以某种格式,但只是一个文本字符串。
2)在Javascript中,var str_json = JSON.stringify(myObject)给出了JSON字符串。
3)我使用AJAX XMLHttpRequest对象在Javascript中发送数据到服务器:
request = new XMLHttpRequest()
request.open(“POST”,“JSON_Handler.php”,true)
request.setRequestHeader(“Content-type”,“application / json”)
request.send(str_json)
[…显示响应的代码…]
4)在服务器上,PHP代码读取JSON字符串:
$ str_json = file_get_contents(‘php:// input’);
这将读取原始POST数据。 $ str_json现在包含来自浏览器的确切JSON字符串。
什么工作(版本2):
1)如果我想使用“application / x-www-form-urlencoded”请求头,我需要创建一个标准的POST字符串“x = y& a = b [etc]它可以把它放在$ _POST关联数组中。所以,在JavaScript中的浏览器:
var str_json =“json_string =”(JSON.stringify(myObject))
当我通过AJAX / XMLHttpRequest发送str_json在上面的版本1,PHP现在可以填充$ _POST数组。显示$ _POST [‘json_string’]的内容将显示JSON字符串。在带有json字符串的$ _POST数组元素上使用json_decode()将正确解码该数据并将其放入一个数组/对象中。
我遇到的陷阱:
最初,我试图发送JSON字符串与application / x-www-form-urlencoded的头,然后尝试立即从PHP中的$ _POST数组读取它。 $ _POST数组始终为空。这是因为它期望数据形式为yval = xval& [rinse_and_repeat]。它没有找到这样的数据,只有JSON字符串,它只是把它丢掉。我检查了请求头,并且POST数据正确发送。
同样,如果我使用application / json头,我也不能通过$ _POST数组访问发送的数据。如果要使用application / json内容类型头,那么必须通过php:// input访问PHP中的原始POST数据,而不是使用$ _POST。
参考文献:
1)如何访问PHP中的POST数据:How to access POST data in PHP?
2)应用程序/ json类型的详细信息,带有一些可以转换为JSON字符串并发送到服务器的示例对象:http://www.ietf.org/rfc/rfc4627.txt