借助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 相关文章推荐
js中if语句的几种优化代码写法
Mar 12 Javascript
jquery自动将form表单封装成json的具体实现
Mar 17 Javascript
原生javascript实现拖动元素示例代码
Sep 01 Javascript
Javascript显示和隐藏ul列表的方法
Jul 15 Javascript
javascript 跨域问题以及解决办法
Jul 17 Javascript
vue如何在自定义组件中使用v-model
May 14 Javascript
js时间戳转yyyy-MM-dd HH-mm-ss工具类详解
Apr 30 Javascript
vue 表单之通过v-model绑定单选按钮radio
May 13 Javascript
layui 实现二级弹窗弹出之后 关闭一级弹窗的方法
Sep 18 Javascript
jquery实现商品sku多属性选择功能(商品详情页)
Dec 20 jQuery
vue递归获取父元素的元素实例
Aug 07 Javascript
Vue实现点击当前行变色
Dec 14 Vue.js
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创建者模式
2014/11/25 PHP
Windows7下的php环境配置教程
2015/02/28 PHP
解决PHP 7编译安装错误:cannot stat ‘phar.phar’: No such file or directory
2017/02/25 PHP
Thinkphp 框架基础之源码获取、环境要求与目录结构分析
2020/04/27 PHP
JavaScript 10件让人费解的事情
2010/02/15 Javascript
javascript的数据类型、字面量、变量介绍
2012/05/23 Javascript
jQuery响应enter键的实现思路
2014/04/18 Javascript
从零学JS之你需要了解的几本书
2014/05/19 Javascript
告诉你什么是javascript的回调函数
2014/09/04 Javascript
使用Node.js为其他程序编写扩展的基本方法
2015/06/23 Javascript
js实现网页多级级联菜单代码
2015/08/20 Javascript
JavaScript仿网易选项卡制作代码
2016/10/06 Javascript
jQuery is not defined 错误原因与解决方法小结
2017/03/19 Javascript
基于Vue实现timepicker
2017/04/25 Javascript
vue一步步实现alert功能
2017/07/05 Javascript
在Vue中使用echarts的实例代码(3种图)
2017/07/10 Javascript
AngularJS 表单验证手机号的实例(非必填)
2017/11/12 Javascript
利用d3.js实现蜂巢图表带动画效果
2019/09/03 Javascript
vue 更改连接后台的api示例
2019/11/11 Javascript
[05:46]DOTA2英雄梦之声_第18期_陈
2014/06/20 DOTA
[06:53]2018DOTA2国际邀请赛寻真——勇于创新的Vici Gaming
2018/08/14 DOTA
Python输出PowerPoint(ppt)文件中全部文字信息的方法
2015/04/28 Python
python 的列表遍历删除实现代码
2020/04/12 Python
python进阶之多线程对同一个全局变量的处理方法
2018/11/09 Python
pyqt5与matplotlib的完美结合实例
2019/06/21 Python
class类在python中获取金融数据的实例方法
2020/12/10 Python
字中字效果的实现【html5实例】
2016/05/03 HTML / CSS
提供世界各地便宜的机票:Sky-tours
2016/07/21 全球购物
耐克中国官方商城:Nike中国
2018/10/18 全球购物
老教师工作总结的自我评价
2013/09/27 职场文书
本科毕业生求职自荐信
2014/02/03 职场文书
努力学习演讲稿
2014/05/10 职场文书
党的群众路线教育实践活动先进个人材料
2014/12/24 职场文书
给老婆的保证书怎么写
2015/05/08 职场文书
如何用JavaScript学习算法复杂度
2021/04/30 Javascript
Pytorch中Softmax和LogSoftmax的使用详解
2021/06/05 Python