加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

js调用接口跨域杂谈

(2011-02-14 18:15:15)
标签:

js调用接口

跨域

it

分类: 程序开发与测试
                                   作者:杨柳
 
谈到js跨域调用大家也写过不少,拿php和js为例;跨域大家自己写一般用ajax或loadjson方式。
(许多开源框架有自己的解决方案,如:jquery ,我们暂不讨论。)
 
再简单罗嗦说下两种方式:
ajax 方式:可同步或异步请求数据。
loadjson 方式 : 接口输出js语句或json数据方式等。
 
二级域名跨域有时候会用到:
『js』 :<script type='text/javascript'>document.domain 'sina.com.cn'</script>
document.domain 方式缺点不安全。
『php接口』:header('P3P: CP="CAO PSA OUR"'); P3P比较普遍,它有好几个参数值大家可以google下,一般写CAO PSA OUR就够用了。
 
下面说说一级域名跨域,以ajax和loadjson方式来说,个人认为最好用的是loadjson方式,写法方便快捷;ajax方式也可以实现。
 
下面主要说说闹心的一级域名ajax方式跨域方法:(一般情况不推荐使用,主要是和大家一起了解下该类方法。)
ajax方式一级域名跨域方法说到闹心,因为ajax方式方式写法相对比较麻烦,以前查资料的时候记得好像有2、3种方式,
下面主要说下我用过的一种方法:iframe 跨域取数据; iframe 方法的主要流程就是 从iframe子页面请求数据,在父页面回调结果操作数据或页面。
 
还是来个实际例子比较好! :)
比如我们想从sina的页面下取AAAA的数据:具体步骤如下
 
首先:在sina 要显示的test.html页面中 添加 <iframe name="ifm_page" id="ifm_page" src="http://event.games.sina.com.cn/cooperation/if_Proxy.html" style="display:none" onload="window.frames['ifm_page'].get_all_gms();window.frames['ifm_page'].get_hots();"  onreadystatechange="window.frames['ifm_page'].get_all_gms();window.frames['ifm_page'].get_hots();"></iframe>
其中src 中的页面程序进行接口请求。
test.html 部分代码:
//父页面js
window.frames['ifm_page'].get_hots();
 
//父页面js 回调函数
function games_hots_Callback()
{
if (window.frames["ifm_page"].games_hots.readyState == 4)
{
if (window.frames["ifm_page"].games_hots.status == 200)
{
gm_hs= window.frames["ifm_page"].games_hots.responseText.split("$")[0];
}
}
}
 
if_Proxy.html 部分代码:
//子页面js
var games_hots =false;
 
//if_Proxy js 函数
function get_hots()
{
if(window.XMLHttpRequest) {
games_hots new XMLHttpRequest();
if (games_hots.overrideMimeType) {
games_hots.overrideMimeType("text/xml");
}
}
else if (window.ActiveXObject) {
try {
games_hots new ActiveXObject("Msxml2.XMLHTTP");
catch (e) {
try {
games_hots new ActiveXObject("Microsoft.XMLHTTP");
catch (e) {}
}
}
if (!games_hots) {
window.alert("不能创建XMLHttpRequest 对象实例.");
return false;
}
//games_hots.onreadystatechange window.parent.frames["ifm_page"].games_hots_Callback();
games_hots.onreadystatechange parent.games_hots_Callback;    //games_hots_Callback 函数在父页面
var encodeURIComponent("/ajax.axd?methodName=GetHotGame");
//修改
games_hots.open("POST", 'http://event.games.sina.com.cn/cooperation/Proxy.php?action=geturl&uri=' +u, true);
games_hots.send("");
}
Proxy.php 为调用AAAA相关接口程序处理。]
 
看了上面代码大家会更明了这种方法【从iframe子页面请求数据,在父页面回调结果操作数据或页面】,这个方法和loadjson比起来确实很麻烦!
要写3个文件,自己产品页面、ifram子页面脚本和请求接口的代理程序接口;了解下这个方式也有好处,联想下跨站取cookie或传值等也可以写个中间代理程序来取。
ajax跨域随笔,请大家多多指教!

0

阅读 收藏 喜欢 打印举报/Report
前一篇:HTML5 介绍
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有