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 判断undefined的实现代码
Nov 26 Javascript
html超链接打开窗口大小的方法
Mar 05 Javascript
浅析Node在构建超媒体API中的作用
Jul 30 Javascript
js实现登陆遮罩效果的方法
Jul 28 Javascript
Javascript连接Access数据库完整实例
Aug 03 Javascript
深入理解Node.js 事件循环和回调函数
Nov 02 Javascript
vue双向绑定及观察者模式详解
Mar 19 Javascript
vue element中axios下载文件(后端Python)
May 10 Javascript
ES6实现图片切换特效代码
Jan 14 Javascript
Vue 实现对quill-editor组件中的工具栏添加title
Aug 03 Javascript
vue监听浏览器原生返回按钮,进行路由转跳操作
Sep 09 Javascript
小程序自定义圆形进度条
Nov 17 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
PHP快速按行读取CSV大文件的封装类分享(也适用于其它超大文本文件)
2014/04/10 PHP
dedecms函数分享之获取某一栏目所有子栏目
2014/05/19 PHP
简单解决微信文章图片防盗链问题
2016/12/17 PHP
Laravel框架模板加载,分配变量及简单路由功能示例
2018/06/11 PHP
php面试中关于面向对象的相关问题
2019/02/13 PHP
地址栏上的一段语句,改变页面的风格。(教程)
2008/04/02 Javascript
JavaScript Event学习第四章 传统的事件注册模型
2010/02/07 Javascript
JQuery 插件制作实践 xMarquee插件V1.0
2010/04/02 Javascript
JavaScript中的this实例分析
2011/04/28 Javascript
实现局部遮罩与关闭原理及代码
2013/02/04 Javascript
简单的Jquery遮罩层代码实例
2013/11/14 Javascript
如何使用jquery easyui创建标签组件
2015/11/18 Javascript
jQuery操作属性和样式详解
2016/04/13 Javascript
Java框架SSH结合Easyui控件实现省市县三级联动示例解析
2016/06/12 Javascript
jQuery属性选择器用法示例
2016/09/09 Javascript
jQuery插件zTree实现删除树节点的方法示例
2017/03/08 Javascript
vue表单自定义校验规则介绍
2018/08/28 Javascript
微信h5静默和非静默授权获取用户openId的方法和步骤
2020/06/08 Javascript
运动检测ViBe算法python实现代码
2018/01/09 Python
Python(Django)项目与Apache的管理交互的方法
2018/05/16 Python
python处理两种分隔符的数据集方法
2018/12/12 Python
python识别图像并提取文字的实现方法
2019/06/28 Python
python内存管理机制原理详解
2019/08/12 Python
用Pelican搭建一个极简静态博客系统过程解析
2019/08/22 Python
python实现程序重启和系统重启方式
2020/04/16 Python
Python定时从Mysql提取数据存入Redis的实现
2020/05/03 Python
python如何写个俄罗斯方块
2020/11/06 Python
Canvas在超级玛丽游戏中的应用详解
2021/02/06 HTML / CSS
商务英语大学生职业生涯规划书范文
2014/01/01 职场文书
大学生毕业个人总结
2015/02/15 职场文书
2015年项目工作总结
2015/04/29 职场文书
离婚民事起诉状
2015/08/03 职场文书
一年之计:2019年下半年的计划
2019/05/07 职场文书
PyQt5 QThread倒计时功能的实现代码
2021/04/02 Python
深入理解CSS 中 transform matrix矩阵变换问题
2021/08/30 HTML / CSS
win10如何开启ahci模式?win10开启ahci模式详细操作教程
2022/07/23 数码科技