我在这里获得了很多信息,所以我想发布我发现的解决方案。
问题: 从浏览器上的Javascript获取JSON数据到服务器,然后让PHP成功解析它。
环境: Windows上的浏览器(Firefox)中的Javascript。LAMP服务器作为远程服务器:Ubuntu上的PHP 5.3.2。
有效的方法(版本1):
1)JSON只是文本。以某种格式的文本,但只是一个文本字符串。
2)在Javascript中,
var str_json = JSON.stringify(myObject)给我JSON字符串。
3)我使用Javascript中的AJAX XMLHttpRequest对象将数据发送到服务器:
request= new XMLHttpRequest()request.open("POST", "JSON_Handler.php", true)request.setRequestHeader("Content-type", "application/json")request.send(str_json)[... pre to display response ...]4)在服务器上,PHP代码读取JSON字符串:
$str_json = file_get_contents('php://input');这将读取原始POST数据。
$str_json现在包含来自浏览器的确切JSON字符串。
可行的方法(版本2):
1)如果我想使用
"application/x-www-form-urlenpred"请求标头,则需要创建一个标准的POST字符串,
"x=y&a=b[etc]"以便在PHP得到它时,可以将其放入
$_POST关联数组中。因此,在浏览器中的Javascript中:
var str_json = "json_string=" + (JSON.stringify(myObject))
当我像上述版本1中一样通过AJAX / XMLHttpRequest发送str_json时,PHP现在将能够填充$ _POST数组。
显示的内容
$_POST['json_string']将显示JSON字符串。将$
_POST数组元素上的json_depre()与json字符串一起使用将正确解码该数据并将其放入数组/对象中。
我遇到的陷阱:
最初,我尝试发送带有application / x-www-form-urlenpred标头的JSON字符串,然后尝试立即从PHP的$
_POST数组中读取它。$ _POST数组始终为空。那是因为它期望格式为yval =
xval&[rinse_and_repeat]的数据。它没有找到这样的数据,只有JSON字符串,并且只是将其丢弃了。我检查了请求标头,然后正确发送了POST数据。
同样,如果我使用application / json标头,则无法再次通过$ _POST数组访问发送的数据。如果要使用application /
json内容类型标头,则必须通过php:// input而不是$ _POST访问PHP中的原始POST数据。



