什么是jsonp格式
什么是jsonp格式
什么是jsonp格式json相信大家都用的多,jsonp也经常看到,其功能主要是 “用来跨域的”
一、JSONP定义
JSONP是英文JSON with Padding的缩写,是一个非官方的协议。它允许在服务器端生成script tags返回至客户端,通过javascript callback的形式来实现站点访问。 JSONP是一种script tag的注入,将server返回的response添加到页面实现特定功能。
二、JSONP由来
要解释JSONP的来由,先要说一下浏览器的“同源策略(SOP:Same Origin Policy)”。 简而言之,就是浏览器限制脚本程序只能和同协议、同域名、同端口的脚本进行交互,这包括共享和传递变量等。cookie的传递也是遵从同样策略。这就造成一些涉及到多个服务器的应用在整合时一些麻烦。跨域访问的问题造成A站点的Ajax代码无法访问B站点的数据。
如何解决跨域访问呢?那就要借助浏览器的一个特性:尽管浏览器不允许页面中的脚本程序跨域读取数据,但却允许HTML引用跨域的资源,如图片,CSS和脚本程序。对于脚本程序的引用比较特殊,它被浏览器解析以后,就和本地的脚本程序别无二致且可立即进行解释并执行。如在B站点的一个js文件,一个简单的提示框:alert(“This is Victor!”);。在A站点引用这个js,这个脚本就会在B站点的应用中执行,显示一个alert信息。由于站外脚本的引用是通过script tag来实现的,而脚本程序又可通过DOM的方式可以对HTML页面的所有标签进行控制(包括动态的创建script标签),这就可以实现通过调用站外程序对本地资源进行更改了。另外,通过<script> 标记的使用,就可从服务端直接返回可执行的JavaScript函数调用或者JSON数据。
三、JSONP原理
1、首先在客户端注册一个callback, 然后把callback的名字传给服务器。此时,服务器先生成 JSON数据。然后以JavaScript 语法的方式,生成一个function, function名字就是传递上来的参数jsonp.
2、然后,将JSON数据直接以入参的方式,放置到function中,这样就生成了一段 js 语法的文档,返回给客户端。
3、最后,在客户端浏览器中解析script标签,并执行返回的JavaScript文档,此时数据作为参数,传入到了客户端预先定义好的回调函数里(动态执行回调函数) 。
四、JSONP的客户端具体实现
不管jQuery也好,extjs也罢,又或者是其他支持jsonp的框架,他们幕后所做的工作都是一样的。
(1)、新建一个lightResult.aspx的页面,用来生成一段这样的代码提供给jsonp.html(服务端的实现这里就不演示了,与你选用的语言无关,说到底就是拼接字符串),函数名jsonpHandler与调用时指定的回调函数名相同,如果没有指定,则默认的是callback:
jsonpHandler({
"code": "aaa",
"price": 1780,
"tickets": 5
});
(2)、利用jQuery如何实现jsonp调用
<!DOCTYPE>
<html>
<head>
<title>Untitled Page</title>
<script type="text/javascript" src=jquery.min.js"></script>
<script type="text/javascript">
jQuery(document).ready(function(){
$.ajax({
type: "get",
async: false,
url: url?code=aaa,
dataType: "jsonp",
jsonpCallback:"jsonpHandler",//自定义的jsonp回调函数名称,默认为jQuery自动生成的随机函数名,也可以写"?",jQuery会自动为你处理数据
success: function(json){
alert('您查询到信息:价格: ' + json.price + ' 元,还剩: ' + json.tickets + ' 张。');
},
error: function(){
alert('失败了!');
}
});
});
</script>
</head>
<body>
</body>
</html>
- vue怎么定义router的动态路由(vue.js Router中嵌套路由的实用示例)
- vue3 响应式的实现过程(Vue3.x使用mitt.js进行组件通信)
- js使用canvas(JavaScript canvas实现七彩时钟效果)
- python 接口测试怎么校验json数据(python接口自动化十七--Json 数据处理---一次爬坑记详解)
- json的语法
- extjs XTemplate的实例
- js如何生成随机数
- js判断变量是否为空
- vue购物车怎么实现(Vue.js框架实现购物车功能)
- js弹出新窗口被拦截的解决方法
- js中拼接字符串的几种方法
- dede友情链接改为logo轮播教程(dedecms广告生成JS文件和JS调用-DEDE广告优化)
- js常见面试题
- js柯里函数的应用场景(深入详解JS函数的柯里化)
- js tab栏案例(JavaScript实现Tab栏切换特效)
- extjs column列布局
- 车友的选择| 轮毂该如何选(车友的选择轮毂该如何选)
- 秦海璐炫耀和王新军热恋蜜事,不料对方吐槽她吃饱后肚子撅老高(秦海璐炫耀和王新军热恋蜜事)
- 秦海璐一袭旗袍惹人倾心,将高级与淡雅展现的游刃有余(秦海璐一袭旗袍惹人倾心)
- 门外之见 海蛎子味 的表演,能走多远(门外之见海蛎子味)
- 三部冷门谍战剧,第一部2014年拍摄,至今还未播出(三部冷门谍战剧)
- 《金陵秘事》的剧情跌宕起伏 给观众带来的怎样的感官体验(金陵秘事的剧情跌宕起伏)
热门推荐
- 云服务器系统怎么选择(云服务器选择什么操作系统?)
- centos zabbix服务端(centos7.9安装zabbix5.0.14及配置过程)
- python数据分析删除重复值(Python3实现从排序数组中删除重复项算法分析)
- nginx动态路径配置(Nginx本地目录映射实现代码实例)
- sqlserver游标使用场景(解析SQL Server聚焦移除Bookmark Lookup、RID Lookup、Key Lookup)
- python的decode函数在哪个模块(python中报错"json.decoder.JSONDecodeError: Expecting value:"的解决)
- mysqlupdate语句用法(MySQL update set 和 and的区别)
- laravel队列不超时(在laravel中实现事务回滚的方法)
- docker阿里云服务器教程(Docker安装阿里云服务器和在虚拟机安装遇到的坑问题小结)
- ftp文件管理工具(ftp服务器PDF文件在线查看的实现方法)