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常见开发技巧详细整理
Jan 02 Javascript
jQuery 网易相册鼠标移动显示隐藏效果实现代码
Mar 31 Javascript
jQuery插件 selectToSelect使用方法
Oct 02 Javascript
Node.js 去掉种子(torrent)文件里的邪恶信息
Mar 27 Javascript
Javascript highcharts 饼图显示数量和百分比实例代码
Dec 06 Javascript
js实现把图片的绝对路径转为base64字符串、blob对象再上传
Dec 29 Javascript
详解VUE 对element-ui中的ElTableColumn扩展
Mar 28 Javascript
webpack分离css单独打包的方法
Jun 12 Javascript
如何将HTML字符转换为DOM节点并动态添加到文档中详解
Aug 19 Javascript
vue项目中运用webpack动态配置打包多种环境域名的方法
Jun 24 Javascript
解决vscode进行vue格式化,会自动补分号和双引号的问题
Oct 26 Javascript
Vue2.0 ES6语法降级ES5的操作
Oct 30 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
Linux中用PHP判断程序运行状态的2个方法
2014/05/04 PHP
关于WordPress的SEO优化相关的一些PHP页面脚本技巧
2015/12/10 PHP
thinkPHP商城公告功能开发问题分析
2016/12/01 PHP
PHP中for循环与foreach的区别
2017/03/06 PHP
PHP实现json_decode不转义中文的方法
2017/05/20 PHP
图片自动缩小的js代码,用以防止图片撑破页面
2007/03/12 Javascript
javascript 有趣而诡异的数组
2009/04/06 Javascript
Textarea与懒惰渲染实现代码
2012/01/04 Javascript
Jquery实现搜索框提示功能示例代码
2013/08/13 Javascript
PHP中CURL的几个经典应用实例
2015/01/23 Javascript
js实现单击图片放大图片的方法
2015/02/17 Javascript
AngularJS基础 ng-init 指令简单示例
2016/08/02 Javascript
JSX在render函数中的应用详解
2019/09/04 Javascript
解决使用layui对select append元素无效或者未及时更新的问题
2019/09/18 Javascript
vuex+axios+element-ui实现页面请求loading操作示例
2020/02/02 Javascript
如何在Vue.JS中使用图标组件
2020/08/04 Javascript
python如何实现远程控制电脑(结合微信)
2015/12/21 Python
Python将图片批量从png格式转换至WebP格式
2020/08/22 Python
Python实现的朴素贝叶斯算法经典示例【测试可用】
2018/06/13 Python
在python中使用with打开多个文件的方法
2019/01/07 Python
Python中字符串List按照长度排序
2019/07/01 Python
解决django同步数据库的时候app models表没有成功创建的问题
2019/08/09 Python
pytorch numpy list类型之间的相互转换实例
2019/08/18 Python
wxPython绘图模块wxPyPlot实现数据可视化
2019/11/19 Python
python实现图片插入文字
2019/11/26 Python
利用pytorch实现对CIFAR-10数据集的分类
2020/01/14 Python
Python Serial串口基本操作(收发数据)
2020/11/06 Python
使用CSS实现弹性视频html5案例实践
2012/12/26 HTML / CSS
如何客观的进行自我评价
2013/12/17 职场文书
单位领导证婚词
2014/01/14 职场文书
2014端午节活动策划方案
2014/01/27 职场文书
使用golang编写一个并发工作队列
2021/05/08 Golang
js 数组 fill() 填充方法
2021/11/02 Javascript
利用python做数据拟合详情
2021/11/17 Python
使用kubeadm命令行工具创建kubernetes集群
2022/03/31 Servers
MySQL主从切换的超详细步骤
2022/06/28 MySQL