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 相关文章推荐
一个js的tab切换效果代码[代码分离]
Apr 11 Javascript
ExtJS 2.0 GridPanel基本表格简明教程
May 25 Javascript
基于jquery实现控制经纬度显示地图与卫星
May 20 Javascript
js正则表达式的使用详解
Jul 09 Javascript
jQuery操作元素css样式的三种方法
Jun 04 Javascript
让JavaScript中setTimeout支持链式操作的方法
Jun 19 Javascript
jQuery基于json与cookie实现购物车的方法
Apr 15 Javascript
利用jquery正则表达式在页面验证url网址输入是否正确
Apr 04 jQuery
Angular 4依赖注入学习教程之FactoryProvider配置依赖对象(五)
Jun 04 Javascript
vue过渡和animate.css结合使用详解
Jun 14 Javascript
js blob类型url的视频下载问题的解决
Nov 29 Javascript
Vue项目结合Vue-layer实现弹框式编辑功能(实例代码)
Mar 11 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
新手学PHP之数据库操作详解及乱码解决!
2007/01/02 PHP
解析zend studio中直接导入svn中的项目的方法步骤
2013/06/21 PHP
8个必备的PHP功能开发
2015/10/02 PHP
浅谈php和js中json的编码和解码
2016/10/24 PHP
Laravle eloquent 多对多模型关联实例详解
2017/11/22 PHP
PHP中引用类型和值类型功能与用法示例
2019/02/26 PHP
Display SQL Server Login Mode
2007/06/21 Javascript
javascript 全等号运算符使用说明
2010/05/31 Javascript
使用隐藏的new来创建对象
2011/03/29 Javascript
javascript动态创建表格及添加数据实例详解
2015/05/13 Javascript
浅谈jQuery绑定事件会叠加的解决方法和心得总结
2016/10/26 Javascript
Vue.js如何优雅的进行form validation
2017/04/07 Javascript
基于Vuejs和Element的注册插件的编写方法
2017/07/03 Javascript
详解vuex结合localstorage动态监听storage的变化
2018/05/03 Javascript
详解element-ui动态限定的日期范围选择器代码片段
2020/07/03 Javascript
centos系统升级python 2.7.3
2014/07/03 Python
如何利用Anaconda配置简单的Python环境
2019/06/24 Python
Python如何筛选序列中的元素的方法实现
2019/07/15 Python
python3 selenium自动化 下拉框定位的例子
2019/08/23 Python
如何给Python代码进行加密
2020/01/10 Python
Python的历史与优缺点整理
2020/05/26 Python
python使用requests库爬取拉勾网招聘信息的实现
2020/11/20 Python
python实现图像高斯金字塔的示例代码
2020/12/11 Python
python 逆向爬虫正确调用 JAR 加密逻辑
2021/01/12 Python
Python爬虫入门教程01之爬取豆瓣Top电影
2021/01/24 Python
美国著名珠宝品牌之一:Jared The Galleria Of Jewelry
2016/10/01 全球购物
Canon佳能美国官方商店:购买数码相机、数码单反相机、镜头和打印机
2016/11/15 全球购物
预订全球最佳旅行体验:Viator
2018/03/30 全球购物
法国票务网站:Ticketmaster法国
2018/07/09 全球购物
澳大利亚最受欢迎的美发和美容在线商店:Catwalk
2018/12/12 全球购物
UDP协议功能
2013/01/06 面试题
面试必备的求职信
2014/05/25 职场文书
优秀工会工作者事迹材料
2014/06/02 职场文书
计划生育宣传标语
2014/06/21 职场文书
建筑施工安全生产责任书
2014/07/22 职场文书
劳动仲裁调解书
2015/05/20 职场文书