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