jquery的ajax和getJson跨域获取json数据的实现方法


Posted in Javascript onFebruary 04, 2014

很多开发人员在使用jquery在前端和服务器端进行数据交互,所以很容易会认为在前端利用jquery就可以读取任何站点的数据了。近日在进行开 发时,因为要和第三方公司的一个项目进行数据的共享,因为考虑多不占用服务器的资源,遂决定直接在html进行数据的读取,不走服务器端进行中转了。然后 正好就遇到了浏览器端跨域访问的问题。

跨域的安全限制都是指浏览器端来说的,服务器端不存在跨域安全限制的问题。

目前浏览器端跨域访问常用的两种方法有两种:

1、通过jQuery的ajax进行跨域,这其实是采用的jsonp的方式来实现的。

jsonp是英文json with padding的缩写。它允许在服务器端生成script tags至返回至客户端,也就是动态生成javascript标签,通过javascript callback的形式实现数据读取。

html页面端示例代码:

 //首先要引入jquery的js包 
 jQuery(document).ready(function(){ 
     $.ajax({ 
         type : "get", //jquey是不支持post方式跨域的 
         async:false, 
         url : "http://api.taobao.com/apitools/ajax_props.do", //跨域请求的URL 
         dataType : "jsonp", 
         //传递给请求处理程序,用以获得jsonp回调函数名的参数名(默认为:callback) 
         jsonp: "jsoncallback", 
         //自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名 
         jsonpCallback:"success_jsonpCallback", 
         //成功获取跨域服务器上的json数据后,会动态执行这个callback函数 
         success : function(json){  
             alert(json); 
         } 
     }); 
 });

服务器端示例代码,以java为例:

服务器端代码,是重点,开始以为,只要客户端通过jsonp就可以直接跨域访问,其实不然,需要服务器端的支持才行。

 public void jsonpTest() throws IOException{ 
     HttpServletRequest request = ServletActionContext.getRequest(); 
     HttpServletResponse response = ServletActionContext.getResponse(); 
     //根据html指定的jsonp回调函数的参数名,获取回调函数的名称 
     //callbackName的值其实就是:success_jsonpCallback 
     String callbackName = (String)request.getAttribute("jsoncallback"); 
     //简单模拟一个json字符串,实际可使用google的gson进行转换,次数通过字符串拼接 
     //{"name":"张三","age":28} 
     //\是对"号进行转义 
     String jsonStr = "{\"name\":\"张三\",\"age\":28}"; 
     //最终返回的数据为:success_jsonpCallback({"name":"张三","age":28}) 
     String renderStr = callbackName+"("+jsonStr+")"; 
     response.setContentType("text/plain;charset=UTF-8"); 
     response.getWriter().write(renderStr); 
 }

jsonp的原理:

首先在客户端注册一个callback (如:'jsoncallback'), 然后把callback的名字(如:success_jsonpCallback)传给服务器端对应的处理函数。

服务器先生成需要返回给客户端的 json 数据。然后以 javascript 语法的方式,生成一个function , function 名字就是传递上来的参数(jsoncallback)的值(success_jsonpCallback) 。

最后将 json 数据直接以入参的方式,放置到 function 中,这样就生成了一段 js 语法的文档,返回给客户端。
客户端浏览器,解析script标签,并将服务器端返回的数据,作为参数,
传入到了客户端预先定义好的 callback 函数(如上例中jquery $.ajax()方法封装的的success: function (json))里。

实际上跨域是通过动态增加script来加载数据,无法直接获得数据,所以需要使用回调函数。

2.使用jquery的getJson进行跨域读取数据

实际上getJson方式的根本原理和ajax使用jsonp的方式是一样的。

jquery中常用getJson来调用获取远程的数据,并通过json格式返回。函数的原型如下:

jQuery.getJSON(url,data,success(data,status,xhr))

参数 描述
url 必需。规定将请求发送的哪个 URL。
data 可选。规定连同请求发送到服务器的数据。
success(data,status,xhr) 可选。规定当请求成功时运行的函数。 额外的参数: response - 包含来自请求的结果数据 status - 包含请求的状态 xhr - 包含 XMLHttpRequest 对象

该函数是简写的ajax函数,实际上等价于:

$.ajax({
  url: url,
  data: data,
  success: callback,
  dataType: json
});

言归正传,下面我们来看如何使用getJson跨域获取数据。

html页面示例代码:

$.getJSON("http://api.taobao.com/apitools/ajax_props.do&jsoncallback=?",
    function (data) {
        alert(data);
    }
);

执行原理:

发送请求时需要传一个callback的回调函数名到服务器端,服务器端拿到这个回调函数名,再将返回数据用参数的形式反回到客户端,这样客户端就能够调到。

所以发送请求URL的地址后面一定要上jsoncallback=?这样的参数,jquery会将?号自动替换成自动生成的回调函数的名称。

所以最终的实际请求为:http://api.taobao.com/apitools/ajax_props.do&jsoncallback=jsonp1322444422697

所以和ajax的方式想比较,也就是callback函数一个是自动生成的函数名,一个是手工指定的函数名。

Javascript 相关文章推荐
javascript应用:Iframe自适应其加载的内容高度
Apr 10 Javascript
jQuery 源码分析笔记(2) 变量列表
May 28 Javascript
myEvent.js javascript跨浏览器事件框架
Oct 24 Javascript
JS实现将人民币金额转换为大写的示例代码
Feb 13 Javascript
Bootstrap Validator 表单验证
Jul 25 Javascript
js仿支付宝多方框输入支付密码效果
Sep 27 Javascript
easyui取消表单实时验证,提交时统一验证的简单实例
Nov 07 Javascript
AjaxUpLoad.js实现文件上传功能
Mar 02 Javascript
浅谈Webpack核心模块tapable解析
Sep 11 Javascript
微信小程序开发的基本流程步骤
Jan 31 Javascript
微信小程序配置服务器提示验证token失败的解决方法
Apr 03 Javascript
vue中使用带隐藏文本信息的图片、图片水印的方法
Apr 24 Javascript
jquery ajax跨域解决方法(json方式)
Feb 04 #Javascript
解决json日期格式问题的3种方法
Feb 02 #Javascript
为jQuery添加Webkit的触摸的方法分享
Feb 02 #Javascript
简单的JavaScript互斥锁分享
Feb 02 #Javascript
在百度知道团队中快速审批新成员的js脚本
Feb 02 #Javascript
基于jquery的simpleValidate简易验证插件
Jan 31 #Javascript
基于JQuery实现的图片自动进行缩放和裁剪处理
Jan 31 #Javascript
You might like
一步一步学习PHP(3) php 函数
2010/02/15 PHP
php中邮箱地址正则表达式实现与详解
2012/04/24 PHP
保存到桌面、设为桌面且带图标的PHP代码
2013/11/19 PHP
PHP数组相关函数汇总
2015/03/24 PHP
谈谈php对接芝麻信用踩的坑
2016/12/01 PHP
thinkphp查询,3.X 5.0方法(亲试可行)
2017/06/17 PHP
PHP时间戳和日期相互转换操作实例小结
2018/12/18 PHP
PHP的PDO预处理语句与存储过程
2019/01/27 PHP
CSS中简写属性要注意TRouBLe的顺序问题(避免踩坑)
2021/03/09 HTML / CSS
IE6下JS动态设置图片src地址问题
2010/01/08 Javascript
获取非最后一列td值并将title设为该值的方法
2013/10/30 Javascript
写JQuery插件的基本知识
2013/11/25 Javascript
js字符串操作方法实例分析
2015/05/06 Javascript
理解javascript定时器中的单线程
2016/02/23 Javascript
简单掌握JavaScript中const声明常量与变量的用法
2016/05/21 Javascript
jQuery Password Validation密码验证
2016/12/30 Javascript
JavaScript中的toString()和toLocaleString()方法的区别
2017/02/15 Javascript
利用jQuery实现简单的拖曳效果实例代码
2017/10/20 jQuery
JavaScript对象拷贝与赋值操作实例分析
2018/12/10 Javascript
如何写好一个vue组件,老夫的一年经验全在这了(推荐)
2019/05/18 Javascript
layui的面包屑或者表单不显示的解决方法
2019/09/05 Javascript
JavaScript实现H5接金币功能(实例代码)
2021/02/22 Javascript
使用Python进行二进制文件读写的简单方法(推荐)
2016/09/12 Python
Python3实现爬取指定百度贴吧页面并保存页面数据生成本地文档的方法
2018/04/22 Python
让Django支持Sql Server作后端数据库的方法
2018/05/29 Python
Django添加KindEditor富文本编辑器的使用
2018/10/24 Python
正确理解Python中if __name__ == '__main__'
2019/01/24 Python
Python 日期时间datetime 加一天,减一天,加减一小时一分钟,加减一年
2020/04/16 Python
CSS3的RGBA中关于整数和百分比值的转换
2015/08/04 HTML / CSS
HTML5通过navigator.mediaDevices.getUserMedia调用手机摄像头问题
2020/04/27 HTML / CSS
remote接口和home接口主要作用
2013/05/15 面试题
租车协议书范本
2014/04/22 职场文书
2015年安康杯竞赛活动总结
2015/03/26 职场文书
详解Redis集群搭建的三种方式
2021/05/31 Redis
Elasticsearch 索引操作和增删改查
2022/04/19 Python
在 Python 中利用 Pool 进行多线程
2022/04/24 Python