JavaScript跨域调用基于JSON的RESTful API


Posted in Javascript onJuly 09, 2016

1. 基本术语

AJAX(Asynchronous JavaScript And XML,异步JavaScript和XML):AJAX是一种用于创建快速动态网页的技术,通过在后台与服务器进行少量数据交换,AJAX可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

JSON(JavaScript Object Notation):JSON是一种轻量级的数据交换格式,可以看成是由大括号包裹起来的多个"key/value"对,格式如下:{"firstName":"Brett", "lastName":"McLaughlin", "email":"abcdefg@gmail.com"}。

Cross Domain(跨域):跨域问题是由于JavaScript语言安全限制中的同源策略造成的,当在页面上使用AJAX请求访问其他服务器的数据时,客户端就会出现跨域问题。

Same Origin Policy(同源策略):同源策略是指一段脚本只能读取来自同一来源的窗口和文档的属性,域名、协议、端口均相同,即是同源。

2. JavaScript跨域解决方案

目前主要有三种JavaScript跨域解决方案:

基于iframe实现跨域:两个页面必须属于一个基础域(例如都是xxx.com,或是xxx.com.cn),使用同一协议(例如都是HTTP)和同一端口(例如都是80)。iframe方案对域名、协议、端口的限制太多,用处不大。

基于Script标签实现跨域(JSONP方案):JSONP(JSON with Padding)是JSON的一种“使用模式”,是一种非官方的跨域数据交互协议,可用于解决主流浏览器的跨域数据访问的问题。JSONP方案的局限性在于:JSONP只能实现GET请求。

基于后台代理实现跨域(CORS方案):CORS(Cross-Origin Resource Sharing,跨域资源共享)是一个W3C标准,它允许浏览器向跨源服务器发出XMLHttpRequest请求,从而克服了AJAX只能同源使用的限制。

3. 基于后台代理实现跨域(CORS方案)

具体解决方案如下:

① 服务器端

服务器端需要在正常的HTTP回应中增加Access-Control-Allow-Origin、Access-Control-Allow-Methods、Access-Control-Allow-Headers等字段。

我的服务器端是用Python写的,HTTP请求调用的webob.Request。

修改办法是,在“res = req.get_response(self.app)”这行代码之后,需要增加如下几行内容:

res.headerlist.append(('Access-Control-Allow-Origin', '*')) 
res.headerlist.append(('Access-Control-Allow-Methods', 'GET, POST')) 
res.headerlist.append(('Access-Control-Max-Age', '3600')) 
res.headerlist.append(('Access-Control-Allow-Headers', 'Access-Control-Allow-Origin, Access-Control-Allow-Methods, Access-Control-Max-Age, X-Auth-Token, Content-Type, Accept'))

其中,Access-Control-Allow-Origin最好限制为前端的访问地址,这样才相对安全,例如:

res.headerlist.append(('Access-Control-Allow-Origin', 'http://10.111.121.26:8080'))

另外,Access-Control-Max-Age可以设置CORS相关配置的缓存时间,这样客户端就不必每次都先进行一次预检请求(Preflight Request)。

预检请求会先向服务器端发出一个OPTIONS方法、包含“Origin”头的请求。只有该请求获得允许以后,才会发起真实的跨域请求。

所以,服务器端在对X-Auth-Token进行鉴权时还需要放过预检请求,例如:

def process_request(self, req): 
if (req.headers.get('X-Auth-Token') != 'open-sesame') and (req.method != 'OPTIONS'): 
return exc.HTTPForbidden()

② 客户端

HTTP请求需要注意到几个地方:

data需要保证是JSON格式的字符串;

contentType规定了编码格式是UTF8;

dataType规定了返回内容是JSON格式。

具体的调用代码如下:

data_param = {"timeType":"LAST_7_DAYS", "hostType":"ALL_HOSTS"} 
$.ajax({ 
url:"http://172.16.17.11:41128/dpi/webApp/eventRetrieve", 
type: "POST", 
data:JSON.stringify(data_param), 
headers:{ 
"X-Auth-Token":"open-sesame", 
"Content-Type":"application/json" 
}, 
contentType: 'text/html; charset=UTF-8', 
dataType: "json", 
success: function(data) { 
alert(data); // Object 
}, 
error: function(XMLHttpRequest, textStatus, errorThrown) { 
alert(XMLHttpRequest.status); 
alert(XMLHttpRequest.readyState); 
alert(textStatus); 
}, 
complete: function(XMLHttpRequest, textStatus) { 
} 
});

以上所述是小编给大家介绍的JavaScript跨域调用基于JSON的RESTful API的全部叙述,希望对大家有所帮助,如果大家想了解更多内容,敬请关注三水点靠木网站,谢谢!

Javascript 相关文章推荐
NiftyCube——轻松实现圆角边框
Feb 20 Javascript
Jquery 类网页微信二维码图块滚动效果具体实现
Oct 14 Javascript
Jquery解析json数据详解
Dec 26 Javascript
javascript中键盘事件用法实例分析
Jan 30 Javascript
举例详解AngularJS中ngShow和ngHide的使用方法
Jun 19 Javascript
js传值后台中文出现乱码的解决方法
Jun 30 Javascript
JS数组返回去重后数据的方法解析
Jan 03 Javascript
Javascript中构造函数要注意的一些坑
Jan 23 Javascript
你可能不知道的前端算法之文字避让(inMap)
Jan 12 Javascript
vue-cli3.0 特性解读
Apr 22 Javascript
vuejs2.0运用原生js实现简单拖拽元素功能
Aug 21 Javascript
基于Webpack4和React hooks搭建项目的方法
Feb 05 Javascript
checkbox 选中一个另一个checkbox也会选中的实现代码
Jul 09 #Javascript
jquery+ajax+text文本框实现智能提示完整实例
Jul 09 #Javascript
jQuery实现的纵向下拉菜单实例详解【附demo源码下载】
Jul 09 #Javascript
EasyUI Pagination 分页的两种做法小结
Jul 09 #Javascript
jQuery实现可以编辑的表格实例详解【附demo源码下载】
Jul 09 #Javascript
JavaScript基础知识点归纳(推荐)
Jul 09 #Javascript
jQuery EasyUI学习教程之datagrid点击列表头排序
Jul 09 #Javascript
You might like
ThinkPHP CURD方法之table方法详解
2014/06/18 PHP
php中数字、字符与对象判断函数用法实例
2014/11/26 PHP
php接口实现拖拽排序功能
2018/04/23 PHP
PHP实现的多进程控制demo示例
2019/07/22 PHP
由prototype_1.3.1进入javascript殿堂-类的初探
2006/11/06 Javascript
JavaScript动态调整TextArea高度的代码
2010/12/28 Javascript
通过url查找a元素并点击
2014/04/09 Javascript
按钮接受回车事件的三种实现方法
2014/06/06 Javascript
鼠标悬浮显示二级菜单效果的jquery实现
2014/10/29 Javascript
Jquery的基本对象转换和文档加载用法实例
2015/02/25 Javascript
jQuery+AJAX实现遮罩层登录验证界面(附源码)
2020/09/13 Javascript
JavaScript中双符号的运算详解
2017/03/12 Javascript
深入探究AngularJs之$scope对象(作用域)
2017/07/20 Javascript
React-Native 组件之 Modal的使用详解
2017/08/08 Javascript
nodejs的路径问题的解决
2018/06/30 NodeJs
jQuery实现鼠标移到某个对象时弹出显示层功能
2018/08/23 jQuery
如何去除富文本中的html标签及vue、react、微信小程序中的过滤器
2018/11/21 Javascript
解决vue单页面应用中动态修改title问题
2019/06/09 Javascript
js对象数组和对象的使用实例详解
2019/08/27 Javascript
js 数组当前行添加数据方法详解
2020/07/28 Javascript
javascript实现京东快递单号的查询效果
2020/11/30 Javascript
js定时器出现第一次延迟的原因及解决方法
2021/01/04 Javascript
python实现批量解析邮件并下载附件
2018/06/19 Python
Python爬虫 urllib2的使用方法详解
2019/09/23 Python
Python基于read(size)方法读取超大文件
2020/03/12 Python
Django用户身份验证完成示例代码
2020/04/03 Python
python爬虫实例之获取动漫截图
2020/05/31 Python
CSS Houdini实现动态波浪纹效果
2019/07/30 HTML / CSS
牦牛毛户外探险服装:Kora
2019/02/08 全球购物
在Ajax应用中信息是如何在浏览器和服务器之间传递的
2016/05/31 面试题
淘宝活动总结范文
2014/06/26 职场文书
指导教师推荐意见
2015/06/05 职场文书
机关单位2016年创先争优活动总结
2016/04/05 职场文书
接收函
2019/04/22 职场文书
创业计划书之书店
2019/09/10 职场文书
浅谈MySql整型索引和字符串索引失效或隐式转换问题
2021/11/20 MySQL