我有两个简单的php页面:
notification.php
<html>
<head><title></title>
<meta charset="UTF-8">
<script src="https://cdn.firebase.com/js/client/2.4.2/firebase.js"></script>
<script src="https://code.jquery.com/jquery-1.12.0.min.js"></script>
<script src="https://code.jquery.com/jquery-migrate-1.2.1.min.js"></script>
</head >
<body>
<script language="JavaScript" >
function gotData(data) {
var toSave = "token=22"; //just a try not a real token
toSave +="&";
var allPropertyNames = Object.keys(data);
var SIZEITEM = allPropertyNames.length;
for (var j=0; j<SIZEITEM; j++) {
var name = allPropertyNames[j];
var value = data[name];
toSave +=name+"="+value;
if(j < SIZEITEM-1)
toSave +="&";
}
console.log(toSave);
$.ajax({
url : "notification_okvalue.php",
type: "POST",
dataType : 'text',
data : {toSave:toSave},
success : function(sended) {
console.log("sucessfull sending:")
console.log(sended);
},
error : function() {
console.log('failed');
}
});
}
</script>
<script src="https://MYFIREBASE.firebaseio.com/chats/-KF4foKsJxIFbLEVxdNC/group.json?callback=gotData"></script>
</body>
</html>
和notification_okvalue.php
<html>
<head>
<title></title>
</head>
<body>
<script language="JavaScript">
var ref = new Firebase("https://MYFIREBASE.firebaseio.com/");
ref.child("prova").set(
{
all_ok:"<?php echo $_POST["token"];?>";
});
</script>
</body>
</html>
控制台给我成功发送的字符串CCD_ 1给了我正确的字符串
令牌=22&-KF4foL4E4E2V4oPU cI=-KF4fi_gWTE4MQ5Bqskw&-KF4foL7g09NGKnQbouU=-KF4fJpvZC6LgbltEesZ
但是,当调用将整个代码传递为POST时,console.log(sended)
确实会向我返回整个notification_okvalue.php代码
当然,我在notification_okvalue.php中收到了$_POST["token"] is not setted
的错误
编辑更具体地说,我实际上并不需要notification_okvalue.php
的响应,但我需要的是,所有传递的$_POST值都必须存储在Firebase中。所以我需要的是Firebase的文字。
我认为将POST数据构造为查询字符串是错误的。比较这个问题。
如果你只使用你的数据对象:,你可能会取得更大的成功
var postData = data;
postData.token = 22;
然后在你的$.帖子中:
data: postData
这样令牌就应该正确到达。不过,您可能仍然会得到整个notification_okvalue.php
作为响应。
AJAX请求不过是一个隐藏的经典客户端请求。这意味着它不能得到比你用浏览器加载页面所能得到的更多或更少的东西。检索的数据是服务器在给定URL处返回的原始代码,包括HTML和任何其他类型的代码。
如果您想使用JSON结构(这将允许您简化请求后的数据处理)创建一个高效的系统,那么在设置内容类型标头后,服务器必须返回一个空白页面,该页面只包含JSON代码。例如,如果您的服务器运行PHP代码:
header('Content-Type: application/json');
echo json_encode(array('foo' => 'bar')); // output : {"foo": "bar"}, which is correct JSON format
实际返回的是一个字符串,必须在JS代码中解析才能正确解释(如果设置了适当的请求参数,这项工作默认由jQuery完成),但它可以是jQuery接受的任何其他格式。有关更多详细信息,请参阅$.ajax
的dataType
参数文档。
另一个不太令人愉快的解决方案是处理请求后的数据(success
函数中的代码),并通过复杂的方式获取您真正想要的部分信息。我不推荐它,因为notification_okvalue.php
没有输出实际的HTML。在您当前的情况下,实现一个如上所述的健壮系统会非常快。没有必要费力地导航到一个空的HTML结构中。
您的notification_okvalue.php不会在响应时刷新任何内容,这就是为什么响应显示整个php代码的原因,如果您打算在响应上写入令牌,则应该简化notification_okvalue.php代码,使其只包含以下行:
<?php echo $_POST["token"];?>