前端时间,遇到的一个问题,状况大约是这样:php
原来的写法:前端
前端js文件中:ajax
$.ajax({json
type:'get',跨域
url:'http://wan.xxx.com/xxx.js',浏览器
success:function(data){缓存
......... 服务器
}curl
})函数
很简单的一个ajax请求;后面在作迁移的时候,因为系统目录的安排,js文件放到了,img.xxx.com域名下,这样就设计到了跨域问题,因而就改为了这样:
$.ajax({
type:'get',
url:'http://img.xxx.com/xxx.js',
dataType:'jsonp',
success:function(data){
.........
}
})
用jsonp的形式,跨域请求,这原本没有什么,很简单的,可这样请求后,就是得不到数据,不知道你们能不能看出问题所在?
跨域请求嘛,就是 dataType用jsonp的格式就对了,可就是不行。。。
后面想了一会,依然无解,后通过同窗的帮助,才知道是这个问题:
跨域请求,须要有一个callback的回调函数,但是上边请求的url中,虽然是请求的另外一个域中的文件,可并无回调函数(请求的是另个域中的js文件,并无回调函数);
因此,解决方法也就是,经过后台程序,写个回调函数便可,而要求必需要请求那个js文件获得json数据,
因此须要后台的方法代理一下请求,从而实现要求,就是作一个后台的代理
因此修改方法以下:
js文件中:
$.ajax({
type:'get',
url:'http://test.com/1.php', //请求的后台代理文件
data:'url=http://img.xxx.com/xxx.js', //传递请求的js地址
dataType:'jsonp',
success:function(data){
........
}
})
后台代理文件中:
1.php
$url=$_REQUEST[url];
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch,CURLOPT_TIMEOUT_MS,200);
$data=curl_exec($ch); //$data即为请求传递过来的url获得的json数据
curl_close($ch);
echo $_REQUEST['callback'].."('{$data}');";
这样就能够实现功能,只不过多了一步后台代理的步骤;
顺便记一下:
ajax中的跨域的几个参数:
jsonp String
在一个jsonp请求中重写回调函数的名字。这个值用来替代在"callback=?"这种GET或POST请求中URL参数里的"callback"部分,好比{jsonp:'onJsonPLoad'}会致使将"onJsonPLoad=?"传给服务器。
为jsonp请求指定一个回调函数名。这个值将用来取代jQuery自动生成的随机函数名。这主要用来让jQuery生成度独特的函数名,这样管理请求更容易,也能方便地提供回调函数和错误处理。你也能够在想让浏览器缓存GET请求的时候,指定这个回调函数名。
本身的简单记录。。。