AJAX跨域请求json数据的实现方法


Posted in Javascript onNovember 11, 2013

我们都知道,AJAX的一大限制是不允许跨域请求。 不过通过使用JSONP来实现。JSONP是一种通过脚本标记注入的方式,它是可以引用跨域URL的js脚本,不过需要提供一个回调函数(必须在您自己的页面上),因此,你可以自己处理结果。 让我们看看JSONP的是怎么在jQuery,MooTools的,Dojo Toolkit中实现的。

jQuery的JSONP
jQuery.getJSON方法:

Js代码

jQuery.getJSON("http://search.twitter.com/search.json?callback=?",{ 
    q: "Arsenal" 
},function(tweets) { 
    // Handle response here 
    console.info("Twitter returned: ",tweets); 
});

或者 类似

Js代码

$.ajax({ 
                type:"get", 
                data:"random="+Math.random(), 
                url:url, 
                dataType:"jsonp", 
                jsonp:"callback", 
                success:function(data){ 
                      $.each(data, function(key, val) { 
                        $("#myDiv").html($("#myDiv").html()+val.cvalue+"</br>"); 
                      }); 
                } 
            });

回调方法的参数 通过getJSON 就可以获取 到json对象

MooTools JSONP
MooTools 需要Request.JSONP Class , 可以从这里下载MooTools More .  选择Request.JSONP,
这样 从另一个域获取json就是小菜一碟了.

Js代码

new Request.JSONP({ 
    url: "http://search.twitter.com/search.json", 
    data: { 
        q: "Arsenal" 
    },//提交的参数, 没有参数可以不写 
        callbackKey: 'jsoncallback',//自己定义回调函数的参数名称 
        onComplete: function(tweets) { 
        // Log the result to console for inspection 
        console.info("Twitter returned: ",tweets); 
    } 
}).send();

如果自己定义了回调函数的参数名称. 跟jquery一样.

服务器端你需要这样去取得:

Js代码

String callback = request.getParameter("jsoncallback");//取得回调方法名 
        response.setHeader("Cache-Control", "no-cache"); 
        response.setContentType("text/json;charset=UTF-8"); 
        PrintWriter out; 
        try { 
            out = response.getWriter(); 
            out.print(callback+"("+message+")");//这里是关键.主要就是这里 
            out.flush(); 
            out.close(); 
        } catch (IOException e) { 
            e.printStackTrace(); 
        }

顺便说一句: 个人比较喜欢mootools的语法结构,和框架设计思路. 再次赞美!

Dojo JSONP
JSONP 在Dojo Toolkit 中需要用上dojo.io.script (点击可以查看示例)

 
Js代码

// dojo.io.script is an external dependency, so it must be required 
dojo.require("dojo.io.script"); // When the resource is ready 
dojo.ready(function() { 
    // Use the get method 
    dojo.io.script.get({ 
        // The URL to get JSON from Twitter 
        url: "http://search.twitter.com/search.json", 
        // The callback paramater 
        callbackParamName: "callback", // Twitter requires "callback" 
        // The content to send 
        content: { 
            q: "Arsenal" 
        }, 
        // The success callback 
        load: function(tweetsJson) {  // Twitter sent us information! 
            // Log the result to console for inspection 
            console.info("Twitter returned: ",tweetsJson); 
        } 
    }); 
});

JSONP是一种非常有效的,可靠的,容易实现的远程数据获取方式。JSONP的策略也使开发人员能够避免繁琐的服务器代理方式,很方便的获取数据。 你可以自己写一个试试
Javascript 相关文章推荐
复制js对象方法(详解)
Jul 08 Javascript
CSS鼠标响应事件经过、移动、点击示例介绍
Sep 04 Javascript
提升PHP安全:8个必须修改的PHP默认配置
Nov 17 Javascript
jQueryMobile之Helloworld与页面切换的方法
Feb 04 Javascript
HTML5 canvas 9绘制图片实例详解
Sep 06 Javascript
简单理解vue中Props属性
Oct 27 Javascript
node.js学习之交互式解释器REPL详解
Dec 08 Javascript
关于javascript作用域的常见面试题分享
Jun 18 Javascript
vue开发拖拽进度条滑动组件
Sep 21 Javascript
Ant Design Vue 添加区分中英文的长度校验功能
Jan 21 Javascript
JS中间件设计模式的深入探讨与实例分析
Apr 11 Javascript
javascript的var与let,const之间的区别详解
Feb 18 Javascript
Javascript弹出窗口的各种方法总结
Nov 11 #Javascript
探讨js中的双感叹号判断
Nov 11 #Javascript
js时间戳格式化成日期格式的多种方法
Nov 11 #Javascript
JavaScript中判断对象类型的几种方法总结
Nov 11 #Javascript
在页面中js获取光标/鼠标的坐标及光标的像素坐标
Nov 11 #Javascript
js中关于一个分号的崩溃示例
Nov 11 #Javascript
javascript中怎么做对象的类型判断
Nov 11 #Javascript
You might like
8个PHP程序员常用的功能汇总
2014/12/18 PHP
jQuery lazyLoad图片延迟加载插件的优化改造方法分享
2013/08/13 Javascript
用jQuery实现的智能隐藏、滑动效果的返回顶部代码
2014/03/18 Javascript
基于js与flash实现的网站flv视频播放插件代码
2014/10/14 Javascript
node.js中的url.format方法使用说明
2014/12/10 Javascript
node.js中的buffer.slice方法使用说明
2014/12/10 Javascript
JS工作中的小贴士之”闭包“与事件委托的”阻止冒泡“
2016/06/16 Javascript
JS基于面向对象实现的多个倒计时器功能示例
2017/02/28 Javascript
vue父子组件的数据传递示例
2017/03/07 Javascript
Vue2.0 从零开始_环境搭建操作步骤
2017/06/14 Javascript
Node调用Java的示例代码
2017/09/20 Javascript
vue服务端渲染操作简单入门实例分析
2019/08/28 Javascript
如何实现iframe父子传参通信
2020/02/05 Javascript
vue中全局路由守卫中替代this操作(this.$store/this.$vux)
2020/07/24 Javascript
动态创建类实例代码
2009/10/07 Python
python比较两个列表大小的方法
2015/07/11 Python
Python 加密的实例详解
2017/10/09 Python
Python中property属性实例解析
2018/02/10 Python
tensorflow 加载部分变量的实例讲解
2018/07/27 Python
Python中操作各种多媒体,视频、音频到图片的代码详解
2020/06/04 Python
查看keras的默认backend实现方式
2020/06/19 Python
django 实现后台从富文本提取纯文本
2020/07/02 Python
HTML5 通信API 跨域门槛将不再高、数据推送也不再是梦
2013/04/25 HTML / CSS
乌克兰珠宝大卖场:Zlato.ua
2020/09/27 全球购物
企划主管岗位职责
2013/12/12 职场文书
五一服装活动方案
2014/01/11 职场文书
新领导上任欢迎词
2014/01/13 职场文书
高中生操行评语
2014/04/25 职场文书
计算机网络及管理学专业求职信
2014/06/05 职场文书
复兴之路展览观后感
2015/06/02 职场文书
2016秋季幼儿园开学寄语
2015/12/03 职场文书
2016国庆节67周年红领巾广播稿
2015/12/18 职场文书
2016党员党课心得体会
2016/01/07 职场文书
2016简单的租房合同范本
2016/03/18 职场文书
python实现监听键盘
2021/04/26 Python
js 数组 fill() 填充方法
2021/11/02 Javascript