借助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 相关文章推荐
jquery常用技巧及常用方法列表集合
Apr 06 Javascript
同时使用n个window onload加载实例介绍
Apr 25 Javascript
Javascript浮点数乘积运算出现多位小数的解决方法
Feb 17 Javascript
jQuery实现点击图片翻页展示效果的方法
Feb 16 Javascript
jQuery实现仿百度帖吧头部固定导航效果
Aug 07 Javascript
Angular 页面跳转时传参问题
Aug 01 Javascript
Javascript中字符串replace方法的第二个参数探究
Dec 05 Javascript
详解vue-resource promise兼容性问题
Jun 20 Javascript
JavaScript中各数制转换全面总结
Aug 21 Javascript
使用Vue.js中的过滤器实现幂方求值的方法
Aug 27 Javascript
深入了解JavaScript 防抖和节流
Sep 12 Javascript
在vue中高德地图引入和轨迹的绘制的实现
Oct 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
php处理json时中文问题的解决方法
2011/04/12 PHP
体育彩票排列三组选三算法分享
2014/03/07 PHP
全面解析PHP操作Memcache基本函数
2016/07/14 PHP
JavaScript解析URL参数示例代码
2013/08/12 Javascript
js加载读取内容及显示与隐藏div示例
2014/02/13 Javascript
通过$(this)使用jQuery包装后的方法或属性
2014/05/18 Javascript
使用JavaScript实现网页版Pongo设计思路及源代码分享
2014/06/16 Javascript
浅析Javascript中bind()方法的使用与实现
2016/04/29 Javascript
对于js垃圾回收机制的理解
2017/09/14 Javascript
r.js来合并压缩css文件的示例
2018/04/26 Javascript
Vue中Quill富文本编辑器的使用教程
2018/09/21 Javascript
JS开发自己的类库实例分析
2019/08/28 Javascript
[22:07]DOTA2-DPC中国联赛 正赛 iG vs Magma 选手采访
2021/03/11 DOTA
Python中装饰器的一个妙用
2015/02/08 Python
对pandas通过索引提取dataframe的行方法详解
2019/02/01 Python
python实现关闭第三方窗口的方法
2019/06/28 Python
python使用pygame实现笑脸乒乓球弹珠球游戏
2019/11/25 Python
Python基于read(size)方法读取超大文件
2020/03/12 Python
一文带你掌握Pyecharts地理数据可视化的方法
2021/02/06 Python
HTML5使用ApplicationCache接口实现离线缓存技术解决离线难题
2012/12/13 HTML / CSS
常用的HTML5列表标签
2017/06/20 HTML / CSS
Whittard官方海外旗舰店:英国百年茶叶品牌
2018/02/22 全球购物
杠杆的科学教学反思
2014/01/10 职场文书
六十岁生日答谢词
2014/01/10 职场文书
会计出纳员的自我评价
2014/01/15 职场文书
大学生通用个人自我评价
2014/04/27 职场文书
负责人任命书范本
2014/06/04 职场文书
优秀毕业生找工作自荐信
2014/06/23 职场文书
物价局领导班子四风问题整改措施
2014/10/26 职场文书
人身损害赔偿协议书格式
2014/11/01 职场文书
郭明义电影观后感
2015/06/08 职场文书
公司董事任命书
2015/09/21 职场文书
CSS3通过var()和calc()函数实现动画特效
2021/03/30 HTML / CSS
详解thinkphp的Auth类认证
2021/05/28 PHP
2007年老电脑安装win11会怎么样? 网友实测win11在老电脑运行良好
2021/11/21 数码科技
Vue组件化(ref,props, mixin,.插件)详解
2022/05/15 Vue.js