将 JSON 数据从 Javascript 发送到 PHP?

2022-08-30 10:25:35

如何将JSON数据从浏览器中的Javascript发送到服务器,并让PHP在那里解析它?


答案 1

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

问题:将 JSON 数据从浏览器上的 Javascript 获取到服务器,并让 PHP 成功解析它。

环境:Windows上的浏览器(Firefox)中的Javascript。LAMP服务器作为远程服务器:Ubuntu上的PHP 5.3.2。

什么有效(版本1):
1)JSON只是文本。特定格式的文本,但只是一个文本字符串。

2)在Javascript中,给我JSON字符串。

3)我在Javascript中使用AJAX XMLHttpRequest对象将数据发送到服务器:var str_json = JSON.stringify(myObject)

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 数据。 现在包含来自浏览器的确切 JSON 字符串。$str_json

什么有效(版本2):
1)如果我想使用请求标头,我需要创建一个标准的POST字符串,以便当PHP获得它时,它可以将其放在关联数组中。所以,在浏览器中的Javascript中:"application/x-www-form-urlencoded""x=y&a=b[etc]"$_POST

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

PHP现在将能够填充$_POST数组,当我通过AJAX / XMLHttpRequest发送str_json时,如上面的版本1所示。

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

我遇到的陷阱:
最初,我试图发送带有appplication/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数据:如何在PHP中访问POST数据?
2) 有关 application/json 类型的详细信息,以及一些可以转换为 JSON 字符串并发送到服务器的示例对象:http://www.ietf.org/rfc/rfc4627.txt


答案 2

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

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

PHP 文件(进程.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,但触发了错误事件而不是成功

尽管对于任何更严重的事情,您应该使用适当的响应代码显式发送适当的标头。