借助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 相关文章推荐
HTML页面如何象ASP一样接受参数
Feb 07 Javascript
JavaScript 计算当天是本年本月的第几周
Mar 22 Javascript
jquery+ajax每秒向后台发送请求数据然后返回页面的代码
Jan 17 Javascript
js中更短的 Array 类型转换
Oct 30 Javascript
jQuery建立一个按字母顺序排列的友好页面索引(兼容IE6/7/8)
Feb 26 Javascript
jQuery实现图片轮播特效代码分享
Sep 15 Javascript
Node.js 中使用 async 函数的方法
Nov 20 Javascript
小程序封装wx.request请求并创建接口管理文件的实现
Apr 29 Javascript
JavaScript 自定义html元素鼠标右键菜单功能
Dec 02 Javascript
JavaScript中的惰性载入函数及优势
Feb 18 Javascript
给原生html中添加水印遮罩层的实现示例
Apr 02 Javascript
适合后台管理系统开发的12个前端框架(小结)
Jun 29 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 mysql数据库操作分页类
2008/06/04 PHP
如何使用php判断服务器是否是HTTPS连接
2013/07/05 PHP
[原创]php集成安装包wampserver修改密码后phpmyadmin无法登陆的解决方法
2016/11/23 PHP
PHP addcslashes()函数讲解
2019/02/03 PHP
PHP7 弃用功能
2021/03/09 PHP
基于jQuery的为attr添加id title等效果的实现代码
2011/04/20 Javascript
JavaScript 判断日期格式是否正确的实现代码
2011/07/04 Javascript
Lab.js初次使用笔记
2015/02/28 Javascript
js replace(a,b)之替换字符串中所有指定字符的方法
2016/08/17 Javascript
jquery datatable服务端分页
2016/08/31 Javascript
JavaScript中return用法示例
2016/11/29 Javascript
微信小程序 安全包括(框架、功能模块、账户使用)详解
2017/01/16 Javascript
Angular.js中angular-ui-router的简单实践
2017/07/18 Javascript
vuejs使用FormData实现ajax上传图片文件
2017/08/08 Javascript
Vue中的字符串模板的使用
2018/05/17 Javascript
浅谈Vue路由快照实现思路及其问题
2018/06/07 Javascript
小程序新版订阅消息模板消息
2019/12/31 Javascript
vue+render+jsx实现可编辑动态多级表头table的实例代码
2020/04/01 Javascript
JavaScript实现网页留言板功能
2020/11/23 Javascript
详解阿里Node.js技术文档之process模块学习指南
2021/01/04 Javascript
python使用xauth方式登录饭否网然后发消息
2014/04/11 Python
python实现井字棋游戏
2020/03/30 Python
Python 闭包的使用方法
2017/09/07 Python
tensorflow 恢复指定层与不同层指定不同学习率的方法
2018/07/26 Python
Windows下将Python文件打包成.EXE可执行文件的方法
2018/08/03 Python
python 图像处理画一个正弦函数代码实例
2019/09/10 Python
python numpy之np.random的随机数函数使用介绍
2019/10/06 Python
如何使用Django Admin管理后台导入CSV
2020/11/06 Python
HTML5中的postMessage API基本使用教程
2016/05/20 HTML / CSS
接受捐赠答谢词
2014/01/27 职场文书
单身联谊活动方案
2014/01/29 职场文书
医院护士工作检讨书
2014/10/26 职场文书
2014年客房部工作总结
2014/11/22 职场文书
公司岗位说明书
2015/10/08 职场文书
python神经网络Xception模型
2022/05/06 Python
Win10玩csgo闪退如何解决?Win10玩csgo闪退的解决方法
2022/07/23 数码科技