我刚刚开始处理对不同服务器中存在的php文件的调用。我知道CORS对于跨域请求至关重要。我一直试图通过ajax方法调用这个文件,参考其他网站和教程,我已经看到讨论找到解决方案,但他们不适合我。请帮忙。
这是我的调用方法:
$.ajax({
type: "GET",
url: "http://cs-server.usc.edu:27952/ResponseProg.php?callback=?", //Relative or absolute path to response.php file
datatype: "jsonp",
data: dataInput,
jsonp:'jsoncallback',
crossDomain:true,
success: function(data)
{
JSONObj = jQuery.parseJSON(data);
contentProvider("#rtrn");
if(JSONObj.ack != "No results found")
{
var paginate=setPager(0);
$("#pgn").html(paginate);
}
},
error: function() {
$("#rtrn").html("Data not retrieved successfully");
}
});
这是我的PHP代码片段:
<?php
#code for data processing...
$rsltjson = json_encode($result,JSON_UNESCAPED_SLASHES);
echo $_GET['jsoncallback']."(".$rsltjson.");";
?>
我试图通过使用JSONP来实现这一目标。我应该有任何标题吗? 我的代码中是否有任何错误?....我怎样才能做到这一点? dataInput是表单数据的序列化形式
答案 0 :(得分:2)
您需要在PHP脚本中放置适当的标头并仅输出JSON:
<?php
header('Access-Control-Allow-Origin: *');
// rest of the code
// output JSON only
echo $rsltjson;
?>
然后使用XMLHttpRequest / ajax调用应该像JSON一样检索数据,而不需要使用JSONP。
Mozilla has plenty to read about it
由于JSONP的重点是绕过跨域限制,使用XMLHttpRequest / ajax调用JSONP资源,完全应用跨域安全性(大概)的方法完全没用。
JSONP的工作原理是将代码直接注入到页面中,调用您定义的函数,这就是JSONP url接受参数的原因。因此,调用JSONP URL的正确方法是:
<script>
function myDataFunc(data) {
JSONObj = jQuery.parseJSON(data);
contentProvider("#rtrn");
if(JSONObj.ack != "No results found") {
var paginate=setPager(0);
$("#pgn").html(paginate);
}
}
</script>
<script src="http://cs-server.usc.edu:27952/ResponseProg.php?jsoncallback=myDataFunc"></script>
JSONP网址将返回如下内容:
myDataFunc({"a":"fhsfg","b":"qfdgers","c":"difgij"});
由于它是作为脚本包含的,因此它将直接在您的页面中执行,并调用您之前定义的函数myDataFunc()
。
另请注意,当您的javascript使用参数jsoncallback
调用网址时,您的php文件会使用GET参数callback
。
最后,您使用jQuery.parseJSON()
,它会从您的代码中产生此错误:
SyntaxError: JSON.parse: unexpected character at line 1 column 2 of the JSON data
原因可以在jQuery docs:
中找到jQuery.parseJSON(json)
描述:采用格式良好的JSON字符串并返回生成的JavaScript值 传入格式错误的JSON字符串会导致抛出JavaScript异常。
您的php脚本使用JSON对象提供回调
{"a":"fhsfg","b":"qfdgers","c":"difgij"}
而不是表示JSON对象的字符串
'{"a":"fhsfg","b":"qfdgers","c":"difgij"}'
请注意周围的引号,这会使此数据成为字符串。我们通过在数据周围添加引号来解决这个问题:
echo $_GET['jsoncallback']."('".$rsltjson."');";
显然,如果您的JSON数据包含单引号,则必须将它们转义。