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简单实现用户注册信息的校验代码
Nov 15 Javascript
jQuery及JS实现循环中暂停的方法
Feb 02 Javascript
js实现接收表单的值并将值拼在表单action后面的方法
Nov 23 Javascript
Jquery实现纵向横向菜单
Jan 24 Javascript
不能不知道的10个angularjs英文学习网站
Mar 23 Javascript
JavaScript cookie详解及简单实例应用
Dec 31 Javascript
jQuery使用siblings获取某元素所有同辈(兄弟姐妹)元素用法示例
Jan 30 Javascript
微信小程序之购物车功能
Sep 23 Javascript
在Vue中使用axios请求拦截的实现方法
Oct 25 Javascript
jQuery实现动态添加和删除input框代码实例
Mar 29 jQuery
angular 服务随记小结
May 06 Javascript
ng-alain的sf如何自定义部件的流程
Jun 12 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
声音就能俘获人心,蕾姆,是哪个漂亮小姐姐配音呢?
2020/03/03 日漫
动态新闻发布的实现及其技巧
2006/10/09 PHP
php ctype函数中文翻译和示例
2014/03/21 PHP
PHP 之 写时复制介绍(Copy On Write)
2014/05/13 PHP
Yii查询生成器(Query Builder)用法实例教程
2014/09/04 PHP
利用PHP函数计算中英文字符串长度的方法
2014/11/11 PHP
PHP中绘制图像的一些函数总结
2014/11/19 PHP
jquery 简单导航实现代码
2009/09/11 Javascript
javascript继承之为什么要继承
2012/11/10 Javascript
防止浏览器记住用户名及密码的简单实用方法
2013/04/22 Javascript
js 实现 input type=&quot;file&quot; 文件上传示例代码
2013/08/07 Javascript
js加入收藏夹代码(兼容ie/ff/op)
2014/05/16 Javascript
浅谈jquery事件处理
2015/04/24 Javascript
jQuery实现的网页竖向菜单效果代码
2015/08/26 Javascript
jQuery操作基本控件方法实例分析
2015/12/31 Javascript
Node.js检测端口(port)是否被占用的简单示例
2016/09/29 Javascript
web打印小结
2017/01/11 Javascript
Angular学习教程之RouterLink花式跳转
2018/05/03 Javascript
JS使用H5实现图片预览功能
2019/09/30 Javascript
解决基于 keep-alive 的后台多级路由缓存问题
2020/12/23 Javascript
如何在vue中使用video.js播放m3u8格式的视频
2021/02/01 Vue.js
javascript中闭包closure的深入讲解
2021/03/03 Javascript
Python使用htpasswd实现基本认证授权的例子
2014/06/10 Python
编写Python脚本使得web页面上的代码高亮显示
2015/04/24 Python
windows上安装python3教程以及环境变量配置详解
2019/07/18 Python
django最快程序开发流程详解
2019/07/19 Python
django 控制页面跳转的例子
2019/08/06 Python
对YOLOv3模型调用时候的python接口详解
2019/08/26 Python
python 实现将list转成字符串,中间用空格隔开
2019/12/25 Python
Python pandas 列转行操作详解(类似hive中explode方法)
2020/05/18 Python
蛋白质世界:Protein World
2017/11/23 全球购物
美国正版电视节目和电影在线观看:Hulu
2018/05/24 全球购物
潘多拉珠宝美国官方网站:Pandora US
2020/06/18 全球购物
物业管理应届生求职信
2013/10/28 职场文书
工程质量承诺书范文
2014/03/27 职场文书
停电通知范文
2015/04/16 职场文书