jsonp 演示实例 —— 基于node
序
同源策略是浏览器处于安全考虑,为通信设置了“相同的域、相同的端口、相同的协议”这一限制。这让我们的ajax请求存在跨域无权限访问的问题。
同时我们发现script标签引入脚本的行为并不受同源策略的限制,但是script引入的文件会被立即执行,如果其内容不符合js语法,则会报错;
操作原理
针对以上情况,诞生了jsonp:
利用script标签的src属性来请求接口,并向接口传递一个回调函数(克服了同源问题)
接口将数据以
回调函数参数
的形式同回调函数一同传回;此时传回则是这样形式的一个字符串:回调函数名(数据)
,这样就符合js语法了(克服了script标签引入内容非js报错的问题)
实例操作
纸上得来总觉浅,绝知此事要躬行。jsonp的原理我早就倒背入流了,但是看着觉得明白,但总觉得少了点什么没抓住。所以,实际操刀试试吧。点击下载源码
下载代码后,进入some-code/jsonp-demo文件夹,该文件夹的目录为:
app.js
package.json
views
命令行进入当前目录,安装包依赖:
npm install
安装完毕后,运行程序:
node app.js
如果看到命令行输出“app is listening”则表示运行成功
修改host
因为需要模拟跨域,所以在host文件中创建俩个不同的域名,在host文件中添加以下内容:
127.0.0.1 www.a.com www.b.com
自此结束,在浏览器中输入http://www.a.com:3000/,如果访问成功则表示大功告成,页面中应该出现俩个按钮。
这个时候,我们打开浏览器的控制台,分别点击页面中的俩个按钮,就可以看到测试结果啦。
代码分析
入口文件:app.js
设定模版引擎
app.set('views', path.join(__dirname, 'views'));
var swig = new swig.Swig();
app.engine('html', swig.renderFile);
app.set('view engine', 'html');
设置路由和接口
访问www.a.com时,渲染view/index.html页面
app.get("/",function(req,res){
res.render('index', {});
})
请求www.b.com/index.json时,返回数据,这里服务器收到jsonp的回调函数名,并把它与数据拼接在一起返回给客户端
//模拟数据
var data = {"brand":23}
app.get("/index.json",function(req,res){
//解析请求路径
var param = urlLib.parse(req.url,true);
var returnValue = param.query.callback+ '(' + JSON.stringify(data) +')';
res.send(returnValue)
})
启动服务
app.listen(3000,function(){
console.log("app is listening")
})
页面:view/index.html
页面中有俩个按钮:
jsonp_button
和ajax_button
,点击以后分别进行jsonp请求和ajax请求。绑定点击事件
jsonp_button.onclick = function(){
var url = "http://www.b.com:3000/index.json?callback=jsonp";
//向页面中添加script标签,进行jsonp请求
creatScript(url)
} ajax_button.onclick = function(){
//ajax请求
var xhr = getXhr();
xhr.open("get","http://www.b.com:3000/index.json");
xhr.send();
if ((xhr.status >= 200 && xhr.status < 300) || xhr.status == 304){
console.log(xhr.responseText);
} else {
console.log("Request was unsuccessful: " + xhr.status);
}
}
function getXhr(){
var xhr;
if(window.XMLHttpRequest){
xhr = new XMLHttpRequest()
}else{
xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
return xhr;
}
- 动态创建script标签 ```
function creatScript(url){
var scriptTag = document.createElement('script');
scriptTag.setAttribute('src', url);
document.getElementsByTagName('head')[0].appendChild(scriptTag);
}
```
- jsonp回调函数 ```
function jsonp(data) {
//获取数据
console.log(data);
}
```
由上面可以得出:jsonp中所有请求数据的后续操作应写在jsonp的回调函数中,它类似于ajax 的 success操作。
最后一句话概括jsonp:jsonp就是原本应该发送json数据给客户端的服务器,不再发送json,改为发送一段调用回调函数的js代码,而原本应该返回的数据则是该函数的参数。
jsonp 演示实例 —— 基于node的更多相关文章
- 转:基于node的web开发框架Express入门
JavaScript 标准参考教程(alpha) 草稿二:Node.js Express框架 GitHub TOP Express框架 来自<JavaScript 标准参考教程(alpha)&g ...
- NodeBB – 基于 Node.js 的开源论坛系统
NodeBB 是一个更好的论坛平台,专门为现代网络打造.它是免费的,易于使用. NodeBB 论坛软件是基于 Node.js 开发,支持 Redis 或 MongoDB 的数据库.它利用 Web So ...
- e2e 自动化集成测试 架构 实例 WebStorm Node.js Mocha WebDriverIO Selenium Step by step (四) Q 反回调
上一篇文章“e2e 自动化集成测试 架构 京东 商品搜索 实例 WebStorm Node.js Mocha WebDriverIO Selenium Step by step (三) SqlServ ...
- LIGHTX-CMS —— 基于 Node.js,Express.js 以及 SQLite 3 搭建的个人博客系统
概述 LIGHTX-CMS 是我基于 Node.js,Express.js 以及 SQLite 3 搭建的个人博客发布系统. 项目本身可以拿来部署个人博客网站,同时我认为其也适合用以新手学习 Node ...
- 基于node和npm的命令行工具——tive-cli
前端开发过程中经常会用到各种各样的脚手架工具.npm全局工具包等命令行工具,如:Vue脚手架@vue/cli.React脚手架create-react-app.node进程守卫工具pm2.本地静态服务 ...
- Selenium2学习-040-JavaScript弹出框(alert、confirm、prompt)操作演示实例
弹出框是网页自动化测试常见得操作页面元素之一,常见的JavaScript弹出框有如下三种: 1.alert(message):方法用于显示带有一条指定消息和一个 OK 按钮的警告框.DemoAlert ...
- 基于 Node.js 平台,快速、开放、极简的 web 开发框架。
资料地址:http://www.expressjs.com.cn/ Express 基于 Node.js 平台,快速.开放.极简的 web 开发框架. $ npm install express -- ...
- Pomelo:网易开源基于 Node.js 的游戏服务端框架
Pomelo:网易开源基于 Node.js 的游戏服务端框架 https://github.com/NetEase/pomelo/wiki/Home-in-Chinese
- Fenix – 基于 Node.js 的桌面静态 Web 服务器
Fenix 是一个提供给开发人员使用的简单的桌面静态 Web 服务器,基于 Node.js 开发.您可以同时在上面运行任意数量的项目,特别适合前端开发人员使用. 您可以通过免费的 Node.js 控制 ...
随机推荐
- 由ArcMap属性字段自增引出字段计算器使用Python的技巧
1.前言 前些日子有人问我ArcMap中要让某个字段的值实现自增有什么方法?我首先想到像SQL Server中对于数值型字段可以设置自增.所以我打开ArcCatalog查看发现只提供默认值 ...
- jQuery 2.0.3 源码分析Sizzle引擎 - 超级匹配
声明:本文为原创文章,如需转载,请注明来源并保留原文链接Aaron,谢谢! 通过Expr.find[ type ]我们找出选择器最右边的最终seed种子合集 通过Sizzle.compile函数编译器 ...
- Dnsmasq安装与配置
默认的情况下,我们平时上网用的本地DNS服务器都是使用电信或者联通的,但是这样也导致了不少的问题,首当其冲的就是上网时经常莫名地弹出广告,或者莫名的流量被消耗掉导致网速变慢.其次是部分网站域名不能正常 ...
- 斐讯Fir302b救砖教程
首先本人是路由器小白,不算是硬件改装高手,昨天收到了微信活动中的斐讯Fir302b,大概当时得奖的有300人,所以最近肯定很大一批朋友手里有这样的一款路由. 上网查了一下,此款路由可以刷基于tomat ...
- 深入学习jQuery节点关系
× 目录 [1]后代元素 [2]祖先元素 [3]兄弟元素 前面的话 DOM可以将任何HTML描绘成一个由多层节点构成的结构.节点之间的关系构成了层次,而所有页面标记则表现为一个以特定节点为根节点的树形 ...
- php常用函数
1.随机数和时间 echo rand(); //随机数生成器echo rand(0,10); //生成某个范围内的随机数 <!DOCTYPE html PUBLIC "-//W3C/ ...
- Python快速教程 尾声
作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 写了将近两年的Python快速教程,终于大概成形.这一系列文章,包括Python基 ...
- SubSonic3.0使用外连接查询时查询不出数据的问题修改
今天在开发时,要使用到外连接查询,如图 老是查不出数据,所以就追踪了一下代码,发现查询后生成的SQL语句变成了内连接了,真是晕 然后继续Debug,发现原来SqlQuery类在调用LeftInnerJ ...
- SSH框架入门知识总结
chap01 领略清晰的MVC流程----Struts讲解技术资料.pdf 提取码:wwi5 chap02 体验控制反转的理念----Spring介绍技术文档.pdf 提取码:0mp3 ch ...
- web开发中不同设备浏览器的区分
通常区分不同设备浏览器是用JavaScript中的navigator.userAgent.toLowerCase()方式获取浏览器的userAgent信息 //使用javascript判断是否是iPh ...