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 相关文章推荐
浅谈JavaScript Date日期和时间对象
Dec 29 Javascript
js实现仿百度瀑布流的方法
Feb 05 Javascript
js实现点击向下展开的下拉菜单效果代码
Sep 01 Javascript
使用three.js 画渐变的直线
Jun 05 Javascript
JavaScript与java语言有什么不同
Sep 22 Javascript
JS获取多维数组中相同键的值实现方法示例
Jan 06 Javascript
web打印小结
Jan 11 Javascript
使用requirejs模块化开发多页面一个入口js的使用方式
Jun 14 Javascript
JS动态修改网页body的背景色实例代码
Oct 07 Javascript
vue配置font-awesome5的方法步骤
Jan 27 Javascript
vue2.* element tabs tab-pane 动态加载组件操作
Jul 19 Javascript
使用vue-element-admin框架从后端动态获取菜单功能的实现
Apr 29 Vue.js
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
自定义PHP分页函数
2006/10/09 PHP
PHP swfupload图片上传的实例代码
2013/09/30 PHP
PHP实现图片压缩的两则实例
2014/07/19 PHP
php判断电子邮件是否正确方法
2018/12/04 PHP
PHP获取HTTP body内容的方法
2018/12/31 PHP
mysqli扩展无法在PHP7下升级问题的解决
2019/09/10 PHP
[原创]js与自动伸缩图片 自动缩小图片的多浏览器兼容的方法总结
2007/03/12 Javascript
解决AJAX中跨域访问出现'没有权限'的错误
2008/08/20 Javascript
JavaScript 脚本将当地时间转换成其它时区
2009/03/19 Javascript
JQUERY1.6 使用方法四 检测浏览器
2011/11/23 Javascript
利用百度地图JSAPI生成h7n9禽流感分布图实现代码
2013/04/15 Javascript
js获取select默认选中的Option并不是当前选中值
2014/05/07 Javascript
加随机数引入脚本不让浏览器读取缓存
2014/09/04 Javascript
Javascript中设置默认参数值示例
2014/09/11 Javascript
JavaScript实现大数的运算
2014/11/24 Javascript
jquery.cookie.js使用指南
2015/01/05 Javascript
JavaScript实现把rgb颜色转换成16进制颜色的方法
2015/06/01 Javascript
浅谈jQuery中height与width
2015/07/06 Javascript
js实现带缓冲效果的仿QQ面板折叠菜单代码
2015/09/06 Javascript
z-blog SyntaxHighlighter 长代码无法换行解决办法(基于jquery)
2015/11/18 Javascript
基于AngularJS实现iOS8自带的计算器
2016/09/12 Javascript
完美实现js焦点轮播效果(一)
2017/03/07 Javascript
Bootstrap布局之栅格系统学习笔记
2017/05/04 Javascript
JS/jQuery实现DIV延时几秒后消失或显示的方法
2018/02/12 jQuery
JS基于对象的链表实现与使用方法示例
2019/01/31 Javascript
elementUI select组件默认选中效果实现的方法
2019/03/25 Javascript
微信小程序学习总结(五)常见问题实例小结
2020/06/04 Javascript
python实现电子词典
2020/04/23 Python
使用python3构建文件传输的方法
2019/02/13 Python
Python中格式化字符串的四种实现
2020/05/26 Python
利用OpenCV中对图像数据进行64F和8U转换的方式
2020/06/03 Python
Python压缩模块zipfile实现原理及用法解析
2020/08/14 Python
Python urlopen()参数代码示例解析
2020/12/10 Python
canvas像素点操作之视频绿幕抠图
2018/09/11 HTML / CSS
马来西亚最大的电器网站:Senheng
2017/10/13 全球购物
德国最新街头服饰网上商店:BODYCHECK
2019/09/15 全球购物