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 相关文章推荐
基于Jquery的简单&简陋Tabs插件代码
Feb 09 Javascript
jQuery之ajax删除详解
Feb 27 Javascript
jQuery $.extend()用法总结
Jun 15 Javascript
JavaScript中的数据类型转换方法小结
Oct 26 Javascript
Bootstrap每天必学之导航
Nov 26 Javascript
BootStrap实用代码片段之一
Mar 22 Javascript
原生js实现addClass,removeClass,hasClass方法
Apr 27 Javascript
Bootstrap 源代码分析(未完待续)
Aug 17 Javascript
BootStrap实现带有增删改查功能的表格(DEMO详解)
Oct 26 Javascript
浅谈react.js 之 批量添加与删除功能
Apr 17 Javascript
利用canvas中toDataURL()将图片转为dataURL(base64)的方法详解
Nov 20 Javascript
JavaScript实现答题评分功能页面
Jun 24 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根据IP判断地区名信息的示例代码
2014/03/03 PHP
PHP中is_file不能替代file_exists的理由
2014/03/04 PHP
php可生成缩略图的文件上传类实例
2014/12/17 PHP
学习jquery之一
2007/04/27 Javascript
JavaScript 闭包深入理解(closure)
2009/05/27 Javascript
jquery 新手学习常见问题解决方法
2010/04/18 Javascript
JavaScript之IE的fireEvent方法详细解析
2013/11/20 Javascript
使用jQuery实现的掷色子游戏动画效果
2014/03/14 Javascript
javascript事件委托的方式绑定详解
2015/06/10 Javascript
探讨JavaScript中的Rest参数和参数默认值
2015/07/29 Javascript
jquery实现隐藏在左侧的弹性弹出菜单效果
2015/09/18 Javascript
AngularJS 路由详解和简单实例
2016/07/28 Javascript
基于js对象,操作属性、方法详解
2016/08/11 Javascript
jQuery插件实现可输入和自动匹配的下拉框
2016/10/24 Javascript
扩展jquery easyui tree的搜索树节点方法(推荐)
2016/10/28 Javascript
jQuery实现页面顶部下拉广告
2016/12/30 Javascript
JS 实现随机验证码功能
2017/02/15 Javascript
利用Vue.js实现求职在线之职位查询功能
2017/07/03 Javascript
vue将对象新增的属性添加到检测序列的方法
2018/02/24 Javascript
JavaScript 中的12种循环遍历方法【总结】
2018/05/31 Javascript
微信小程序实现发红包功能
2018/07/11 Javascript
详解ECMAScript typeof用法
2018/07/25 Javascript
使用javascript做时间倒数读秒功能的实例
2019/01/23 Javascript
vue cli3 配置proxy代理无效的解决
2019/10/30 Javascript
Jquery异步上传文件代码实例
2019/11/13 jQuery
vue实现移动端图片上传功能
2019/12/23 Javascript
nuxt 每个页面head标签内容设置方式
2020/11/05 Javascript
使用Python三角函数公式计算三角形的夹角案例
2020/04/15 Python
python转化excel数字日期为标准日期操作
2020/07/14 Python
CSS3 transform的skew属性值图文详解
2014/07/21 HTML / CSS
绿色出行口号
2014/06/18 职场文书
陈安之励志演讲稿
2014/08/21 职场文书
最美家庭活动方案
2014/08/31 职场文书
向国旗敬礼活动总结范文2014
2014/09/27 职场文书
《爱的教育》读书心得
2014/11/08 职场文书
三八妇女节寄语
2015/02/27 职场文书