如何从Javascript发送JSON数据到PHP?

63 浏览
0 Comments

如何从Javascript发送JSON数据到PHP?

我该如何在浏览器中使用Javascript发送JSON数据到服务器并让PHP解析?

admin 更改状态以发布 2023年5月20日
0
0 Comments

使用jQuery的Javascript文件(干净但有库开销):

$.ajax({
    type: 'POST',
    url: 'process.php',
    data: {json: JSON.stringify(json_data)},
    dataType: 'json'
});

PHP文件(process.php):

directions = json_decode($_POST['json']);
var_dump(directions);

请注意,如果您在JavaScript中使用回调函数:

$.ajax({
    type: 'POST',
    url: 'process.php',
    data: {json: JSON.stringify(json_data)},
    dataType: 'json'
})
.done( function( data ) {
    console.log('done');
    console.log(data);
})
.fail( function( data ) {
    console.log('fail');
    console.log(data);
});

您必须在您的PHP文件中返回一个JSON对象(以JavaScript的格式),才能在您的JavaScript代码中获得“完成/成功”的结果。 至少返回/打印:

print('{}');

请参见Ajax请求返回200 OK但错误事件被触发而不是成功

尽管对于任何更严重的问题,您都应该明确地返回一个适当的响应码。

0
0 Comments

我在这里得到了很多信息,所以我想发表我发现的解决方案。

问题:从在浏览器上的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)
[... code to display response ...]

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]",以便当PHP获取它时,它可以将其放入$_POST关联数组中。因此,在浏览器中的Javascript中:

var str_json = "json_string=" + (JSON.stringify(myObject))

当我通过AJAX/XMLHttpRequest像版本1一样发送str_json时,PHP现在可以填充$_POST数组。

显示$_POST['json_string']的内容将显示JSON字符串。使用json_decode()处理具有JSON字符串的$_POST数组元素将正确解码该数据并将其放入数组/对象中。

我遇到的陷阱:
最初,我尝试使用application/x-www-form-urlencoded标头发送JSON字符串,然后尝试立即从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)关于application/json类型的详细信息,包括一些可以转换为JSON字符串并发送到服务器的示例对象:http://www.ietf.org/rfc/rfc4627.txt

0