借助script进行Http跨域请求:JSONP实现原理及代码


Posted in Javascript onMarch 19, 2013

<script>元素的src属性能设置URL并发起HTTP GET请求, 使用<script>元素实现脚本操作HTTP可以跨域通信而不受限与同源策略. 通常, 使用基于<script>的Ajax传输协议时, 服务器响应采用JSON编码的数据格式, 当执行脚本时候, JavaScript解析器能够自动将其解码. 由于它使用JSON数据格式, 因此这种Ajax传输协议也叫做"JSONP". 所以使用jsonp技术, 只需要设置<script>的src属性, 并且插入到document中, 然后浏览器就会发送一个http请求以下载src属性所执行的url.

当使用<script>元素调用数据时, 响应内容必须用JavaScript函数名和圆括号包裹起来(也就是只能作为函数的参数), 而不是直接的一段json数据:

response( 
[1, 2, {"hello", "world"}] 
)

为了可行期间, 我们必须通过某种方式告诉服务, 它正在从一个<script>元素调用, 必须返回一个jsonp响应, 而不是普通的json, 这个可以通过在url中添加一个查询参数来实现: 例如, 追加"?json"(或者&json)

在实践中, 支持jsonp的服务不会强制指定客户端必须实现的回调函数名称, 比如response. 相反它们使用查询参数的值, 允许客户端指定一个函数名,然后使用函数名去填充响应.

//根据指定的url发送一个json请求 
//然后把解析得到的响应数据传递给回调函数 
//在url中添加一个名为jsonp的查询参数, 用于指定该请求的回调函数的名称 
function getJSONP(url, callback){ 
//为本次请求创建一个唯一的回调函数名称 
var cbnum = "cb"+getJSONP.counter++; 
var cbname = "getJSONP."+cbnum; //作为jsonp函数的属性 
//将回调函数名称以表单编码的形式添加到url查询部分中 
if(url.indexOf("?") === -1){ 
url += "?jsonp="+cbname; 
}else{ 
url += "&jsonp="+cbname; 
} 
//创建<script>用于发送请求 
var script = document.createElement("script"); 
//定义被脚本执行的回调函数 
getJSONP[cbnum] = function(response){ 
try{ 
callback(response); //处理响应 
} 
finally{ 
//删除该函数, 并移除相应script元素 
delete getJSONP[cbnum]; 
script.parentNode.removeChild(script); 
} 
} 
//立即触发http请求 
script.src = url; 
document.body.appendChild(script); 
} 
getJSONP.counter = 0;
Javascript 相关文章推荐
捕获关闭窗口的脚本
Jan 10 Javascript
基于jquery的一行代码轻松实现拖动效果
Dec 28 Javascript
javascript中将Object转换为String函数代码 (json str)
Apr 29 Javascript
基于jQuery的动态增删改查表格信息,可左键/右键提示(原创自Zjmainstay)
Jul 31 Javascript
javaScript arguments 对象使用介绍
Oct 18 Javascript
jQuery实现下拉框左右选择的简单实例
Feb 22 Javascript
Vue表单验证插件Vue Validator使用方法详解
Apr 07 Javascript
bootstrap-table实现服务器分页的示例 (spring 后台)
Sep 01 Javascript
浅谈Vue组件及组件的注册方法
Aug 24 Javascript
layer.open回调获取弹出层参数的实现方法
Sep 10 Javascript
html5 录制mp3音频支持采样率和比特率设置
Jul 15 Javascript
用JS创建一个录屏功能
Nov 11 Javascript
DIV+CSS+JS不间断横向滚动实现代码
Mar 19 #Javascript
下载文件个别浏览器文件名乱码解决办法
Mar 19 #Javascript
jQuery点击tr实现checkbox选中的方法
Mar 19 #Javascript
js多级树形弹出一个小窗口层(非常好用)实例代码
Mar 19 #Javascript
Javascript中valueOf与toString区别浅析
Mar 19 #Javascript
Javascript Throttle &amp; Debounce应用介绍
Mar 19 #Javascript
JS 实现获取打开一个界面中输入的值
Mar 19 #Javascript
You might like
PHPShop存在多个安全漏洞
2006/10/09 PHP
php+highchats生成动态统计图
2014/05/21 PHP
PHP实现批量上传单个文件
2015/12/29 PHP
ThinkPHP like模糊查询,like多匹配查询,between查询,in查询,一般查询书写方法
2018/09/26 PHP
Javascript Memoizer浅析
2014/10/16 Javascript
jquery实现拖拽调整Div大小
2015/01/30 Javascript
JavaScript获取表格(table)当前行的值、删除行、增加行
2015/07/03 Javascript
js控制元素显示在屏幕固定位置及监听屏幕高度变化的方法
2015/08/11 Javascript
Angular.js与Bootstrap相结合实现表格分页代码
2016/04/12 Javascript
15个值得开发人员关注的jQuery开发技巧和心得总结【经典收藏】
2016/05/25 Javascript
深入理解JavaScript中的call、apply、bind方法的区别
2016/05/30 Javascript
javascript中mouseenter与mouseover的异同
2017/06/06 Javascript
Vue 多层组件嵌套二种实现方式(测试实例)
2017/09/08 Javascript
详解Webpack实战之构建 Electron 应用
2017/12/25 Javascript
JS正则表达式封装与使用操作示例
2019/05/15 Javascript
用JavaScript实现贪吃蛇游戏
2020/10/23 Javascript
[07:09]2014DOTA2国际邀请赛-Newbee再次发威成功晋级决赛
2014/07/19 DOTA
[02:37]2018DOTA2亚洲邀请赛赛前采访-EG篇
2018/04/03 DOTA
Python设计模式之装饰模式实例详解
2019/01/21 Python
anaconda中更改python版本的方法步骤
2019/07/14 Python
python生成器推导式用法简单示例
2019/10/08 Python
python 如何将office文件转换为PDF
2020/09/22 Python
Python使用Turtle模块绘制国旗的方法示例
2021/02/28 Python
canvas生成带二维码海报的踩坑记录
2019/09/11 HTML / CSS
捷克母婴用品购物网站:Feedo.cz
2020/12/28 全球购物
C++面试题:关于链表和指针
2013/06/05 面试题
学年末自我鉴定
2014/01/21 职场文书
创建精神文明单位实施方案
2014/03/08 职场文书
工厂搬迁方案
2014/05/11 职场文书
科级干部群众路线教育实践活动对照检查材料思想汇报
2014/09/20 职场文书
硕士学位论文评语
2014/12/31 职场文书
感谢信怎么写
2015/01/21 职场文书
详解Javascript实践中的命令模式
2021/05/05 Javascript
MySQL中IF()、IFNULL()、NULLIF()、ISNULL()函数的使用详解
2021/06/26 MySQL
解决Mysql报错 Table 'mysql.user' doesn't exist
2022/05/06 MySQL
MySQL 语句执行顺序举例解析
2022/06/05 MySQL