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 相关文章推荐
在Javascript中为String对象添加trim,ltrim,rtrim方法
Sep 22 Javascript
动态修改DOM 里面的 id 属性的弊端分析
Sep 03 Javascript
通过jQuery源码学习javascript(三)
Dec 27 Javascript
简单的js表格操作
Sep 24 Javascript
ES6中参数的默认值语法介绍
May 03 Javascript
详解vue模拟加载更多功能(数据追加)
Jun 23 Javascript
Vue.js基础指令实例讲解(各种数据绑定、表单渲染大总结)
Jul 03 Javascript
基于vue.js路由参数的实例讲解——简单易懂
Sep 07 Javascript
Vue 实现把表单form数据 转化成json格式的数据
Oct 29 Javascript
vue实现图片上传功能
May 28 Javascript
vue页面引入three.js实现3d动画场景操作
Aug 10 Javascript
Vue 简单实现前端权限控制的示例
Dec 25 Vue.js
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
星际争霸任务指南——虫族
2020/03/04 星际争霸
SONY ICF-F10中波修复记
2021/03/02 无线电
SWFUpload与CI不能正确上传识别文件MIME类型解决方法分享
2011/04/18 PHP
php使用array_search函数实现数组查找的方法
2015/06/12 PHP
php操纵mysqli数据库的实现方法
2016/09/18 PHP
在Z-Blog中运行代码[html][/html](纯JS版)
2007/03/25 Javascript
jQuery阻止事件冒泡具体实现
2013/10/11 Javascript
原生javaScript做得动态表格(注释写的很清楚)
2013/12/29 Javascript
深入理解Ajax的get和post请求
2016/06/02 Javascript
Ionic实现页面下拉刷新(ion-refresher)功能代码
2016/06/03 Javascript
Vue.js手风琴菜单组件开发实例
2017/05/16 Javascript
JS设置随机出现2个数字的实例代码
2017/07/19 Javascript
原生JS实现简单的倒计时功能示例
2018/08/30 Javascript
Vue实现购物车的全选、单选、显示商品价格代码实例
2019/05/06 Javascript
Node.js 在本地生成日志文件的方法
2020/02/07 Javascript
vue 页面回退mounted函数不执行的解决方案
2020/07/26 Javascript
分享8个JavaScript库可更好地处理本地存储
2020/10/12 Javascript
Nuxt的动态路由和参数校验操作
2020/11/09 Javascript
Vue实现圆环进度条的示例
2021/02/06 Vue.js
[49:13]DOTA2上海特级锦标赛C组资格赛#1 OG VS LGD第一局
2016/02/27 DOTA
Python之str操作方法(详解)
2017/06/19 Python
调用其他python脚本文件里面的类和方法过程解析
2019/11/15 Python
Tensorflow的梯度异步更新示例
2020/01/23 Python
Python脚本破解压缩文件口令实例教程(zipfile)
2020/06/14 Python
浅析Python面向对象编程
2020/07/10 Python
Python lambda表达式原理及用法解析
2020/08/18 Python
selenium3.0+python之环境搭建的方法步骤
2021/02/01 Python
基于css3仿造window7的开始菜单
2010/06/17 HTML / CSS
医院门卫岗位职责
2013/12/30 职场文书
优秀士兵先进事迹
2014/02/06 职场文书
安全横幅标语
2014/06/09 职场文书
老人再婚离婚协议书范本
2014/10/27 职场文书
2014年旅游局法制宣传日活动总结
2014/11/01 职场文书
2014年社区个人工作总结
2014/12/02 职场文书
长城导游词300字
2015/01/30 职场文书
《巨人的花园》教学反思
2016/02/19 职场文书