将JSON数据从Javascript发送到PHP?
如何将JSON数据从浏览器中的Javascript发送到服务器,然后让PHP在其中解析?
10个解决方案
56 votes
我在这里获得了很多信息,所以我想发布我发现的解决方案。
问题:从浏览器上的Javascript获取JSON数据到服务器,然后让PHP成功解析它。
环境:Windows上的浏览器(Firefox)中的Javascript。 LAMP服务器作为远程服务器:Ubuntu上的PHP 5.3.2。
什么有效(版本1):
1)JSON只是文本。 以某种格式的文本,但只是一个文本字符串。
2)在Javascript中,$_POST['json_string']给了我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数据。 现在,$_POST['json_string']包含来自浏览器的确切JSON字符串。
什么有效(版本2):
1)如果我想使用$_POST['json_string']请求标头,则需要创建"x=y&a=b[etc]"的标准POST字符串,以便在PHP获取它时,可以将其放入$_POST关联数组中。 因此,在浏览器中的Javascript中:
var str_json = "json_string=" + (JSON.stringify(myObject))
当我像上述版本1中一样通过AJAX / XMLHttpRequest发送str_json时,PHP现在将能够填充$ _POST数组。
显示$_POST['json_string']的内容将显示JSON字符串。 将$ _POST数组元素上的json_decode()与json字符串一起使用将正确解码该数据并将其放入数组/对象中。
我遇到的陷阱:
最初,我尝试发送带有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数据。
参考文献:
1)如何在PHP中访问POST数据:如何在PHP中访问POST数据?
2)有关application / json类型的详细信息,其中包含一些示例对象,这些示例对象可以转换为JSON字符串并发送到服务器:[http://www.ietf.org/rfc/rfc4627.txt]
kermit answered 2020-07-09T13:51:25Z
16 votes
使用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,但会引发错误事件而不是成功
尽管对于更严重的问题,您应该使用适当的响应代码显式发送回适当的标头。
Cyrille answered 2020-07-09T13:52:08Z
6 votes
使用AJAX的HTML输入字段(发送到服务器JSON,用PHP解析JSON并发送回客户端)的JavaScript上的简单示例:
Last Name
placeholder="Last name"/>
Age
placeholder="Age"/>
Show
var xmlhttp;
function actionSend() {
if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari
xmlhttp = new XMLHttpRequest();
}
else {// code for IE6, IE5
xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
}
var values = $("input").map(function () {
return $(this).val();
}).get();
var myJsonString = JSON.stringify(values);
xmlhttp.onreadystatechange = respond;
xmlhttp.open("POST", "ajax-test.php", true);
xmlhttp.send(myJsonString);
}
function respond() {
if (xmlhttp.readyState == 4 && xmlhttp.status == 200) {
document.getElementById('result').innerHTML = xmlhttp.responseText;
}
}
PHP文件ajax-test.php:
$str_json = file_get_contents('php://input'); //($_POST doesn't work here)
$response = json_decode($str_json, true); // decoding received JSON to array
$lName = $response[0];
$age = $response[1];
echo '
First Name | Age |
---|---|
|
|
';
?>
Aconic answered 2020-07-09T13:52:33Z
4 votes
PHP具有称为json_decode()的内置函数。 只需将JSON字符串传递到此函数中,它将把它转换为等效的PHP字符串,数组或对象。
为了将其作为字符串从Javascript传递,您可以使用将其转换为JSON
JSON.stringify(object);
或诸如Prototype之类的库
John answered 2020-07-09T13:53:02Z
4 votes
有3种相关方式可以将数据从客户端(HTML,Javascript,Vbscript等)发送到服务器端(PHP,ASP,JSP等)
1. HTML form Posting Request (GET or POST).
2. AJAX (This also comes under GET and POST)
3. Cookie
HTML表单发布请求(GET或POST)
这是最常用的方法,我们可以通过此方法发送更多数据
AJAX
这是异步方法,必须以安全的方式工作,在这里我们还可以发送更多数据。
曲奇饼
这是使用少量不敏感数据的好方法。 这是处理少量数据的最佳方法。
您可以选择HTML表单发布或AJAX。 但是在发送到服务器之前,请先验证您的json或使用[http://jsonlint.com/]之类的链接
如果您有Json Object,则使用JSON.stringify(object)将其转换为String;如果您有JSON字符串,则按原样发送它。
Robin Michael Poothurai answered 2020-07-09T13:53:57Z
2 votes
使用JSON.stringify(yourObj)或Object.toJSON(yourObj),最后一个用于使用prototype.js,然后使用所需的任何内容(ajax或提交)将其发送,并根据建议使用json_decode([http:// www (.php.net / manual / en / function.json-decode.php])解析为php。 然后您可以将其用作数组。
khael answered 2020-07-09T13:54:17Z
2 votes
我建议使用jquery.post()方法。
ravi404 answered 2020-07-09T13:54:37Z
1 votes
var myJSONObject = {"bindings": 11};
alert(myJSONObject);
var stringJson =JSON.stringify(myJSONObject);
alert(stringJson);
jianfeng answered 2020-07-09T13:54:53Z
0 votes
您可以轻松地将对象转换为urlencoded字符串:
function objToUrlEncode(obj, keys) {
let str = "";
keys = keys || [];
for (let key in obj) {
keys.push(key);
if (typeof (obj[key]) === 'object') {
str += objToUrlEncode(obj[key], keys);
} else {
for (let i in keys) {
if (i == 0) str += keys[0];
else str += `[${keys[i]}]`
}
str += `=${obj[key]}&`;
keys.pop();
}
}
return str;
}
console.log(objToUrlEncode({ key: 'value', obj: { obj_key: 'obj_value' } }));
// key=value&obj[obj_key]=obj_value&
Юрий Столов answered 2020-07-09T13:55:13Z
-2 votes
我找到了简单的方法,但我知道这并不完美
1.将json分配给
如果您的JSON是
var data = [
{key:1,n: "Eve"}
,{key:2,n:"Mom"}
];
在--- main.php中
var data = [
{key:1,n: "Eve"}
,{key:2,n:"Mom"} ];
function setInput(data){
var input = document.getElementById('data');
input.value = JSON.stringify(data);
var submit =document.getElementById('submit');
//to submit and goto second page
submit.click();
}
//call function
setInput(data);
在------ second.php -----
printJson();
function printJson(){
var data = getUrlVars()["data"];
//decode uri to normal character
data = decodeURI(data);
//for special character , / ? : @ & = + $ #
data = decodeURIComponent(data);
//remove " ' " at first and last in string before parse string to JSON
data = data.slice(1,-1);
data = JSON.parse(data);
alert(JSON.stringify(data));
}
//read get variable form url
//credit http://papermashup.com/read-url-get-variables-withjavascript/
function getUrlVars() {
var vars = {};
var parts = window.location.href.replace(/[?&]+([^=&]+)=([^&]*)/gi, function(m,key,value) {
vars[key] = value;
});
return vars;
}
OatMs answered 2020-07-09T13:55:51Z