jsonp是什么

简介: jsonp是什么

转自 http://mp.weixin.qq.com/s/xNnKAeLv6sO0T-IvP2AUlQ        

一、JSONP的诞生

  • 首先,因为ajax无法跨域,然后开发者就有所思考
  • 其次,开发者发现, <script>标签的src属性是可以跨域的
    把跨域服务器写成 调用本地的函数 ,回调数据回来不就好了?
  • json刚好被js支持(object)
  • 调用跨域服务器上动态生成的js格式文件(不管是什么类型的地址,最终生成的返回值都是一段js代码)
  • 这种获取远程数据的方式看起来非常像ajax,但其实并不一样
    便于客户端使用数据,逐渐形成了一种非正式传输协议,人们把它称作JSONP。
  • 传递一个callback参数给跨域服务端,然后跨域服务端返回数据时会将这个callback参数作为函数名来包裹住json数据即可。

二、老板,来一斤栗子。

【栗子一】
跨域服务器
文件:remote.js 
代码:
alert('我是远程文件');
本地
<script type="text/javascript" src="跨域服务器/remote.js"></script>
这边做的就是直接引入一个js,页面将会弹出一个提示窗体,显示 我是远程文件。

 

【栗子二】
跨域服务器
文件:remote.js 
代码:
localHandler({"result":"我是远程js带来的数据"});
本地
<script type="text/javascript">
   var localHandler = function(data){
       alert('我是本地函数,可以被跨域的remote.js文件调用,远程js带来的数据是:' + data.result);
   };
</script>
<script type="text/javascript" src="跨域服务器/remote.js"></script>
这边做的是 
1、本地定义一个函数 
2、引入一个js 
3、被引入的js里面,调用这个函数
页面将会弹出一个提示窗体。显示本地函数被跨域的远程js调用成功,并且还接收到了 我是远程js带来的数据。 
新问题出现了:让远程js知道它应该调用的本地函数叫什么名字呢?毕竟是jsonp的服务者都要面对很多服务对象,而这些服务对象各自的本地函数都不相同啊?

 

【栗子三】

跨域服务端提供的js脚本动态生成,这样调用者可以传一个参数过去告诉跨域服务端“我想要一段调用XXX函数的js代码,请你返回给我”,于是跨域服务器就可以按照客户端的需求来生成js脚本并响应了。

跨域服务器
文件:flightResult.php 
代码:
flightHandler({
   "code":"CA1998",
   "price": 1780,
   "tickets": 5
});
本地
<script type="text/javascript">
   // 得到航班信息查询结果后的回调函数
   var flightHandler = function(data){
       alert('你查询的航班结果是:票价 ' + data.price + ' 元,' + '余票 ' + data.tickets + ' 张。');
   };
   // 提供jsonp服务的url地址(不管是什么类型的地址,最终生成的返回值都是一段javascript代码)
   var url = "跨域服务器/flightResult.php?code=CA1998&callback=flightHandler";
   // 创建script标签,设置其属性
   var script = document.createElement('script');
   script.setAttribute('src', url);
   // 把script标签加入head,此时调用开始
   document.getElementsByTagName('head')[0].appendChild(script);
</script>

 

这次我们做的是

1、动态创建脚本

2、url中传递了一个code参数,服务器去做查询CA1998次航班的信息,callback参数告诉服务器,我的本地回调函数叫做flightHandler

3、跨域服务端调用这个函数flightHandler 页面将会弹出一个提示窗体。把票价、余票以及张数给传递回来了。

三、那么服务器到底做了什么呢? 说到底,就是拼接字符串。

// 数据
$data = [
   "name":"anonymous66",
   "age":"18",
   "like":"jianshu"
];
// 接收callback函数名称
$callback = $_GET['callback'];
// 输出
echo $callback . "(" . json_encode($data) . ")";

 

四、与AJAX的区别是什么?

ajax和jsonp本质上是不同的东西。

ajax的核心是通过XmlHttpRequest获取非本页内容

jsonp的核心则是动态添加<script>标签来调用服务器提供的js脚本。


相关文章
|
存储 SQL 数据采集
一篇文章彻底理解大数据的列式存储
一篇文章彻底理解大数据的列式存储
一篇文章彻底理解大数据的列式存储
|
8月前
|
机器学习/深度学习 存储 人工智能
【科普向】模型蒸馏和模型量化到底是什么???
在数字化快速发展的时代,人工智能(AI)技术已广泛应用,但大型深度学习模型对计算资源的需求日益增长,增加了部署成本并限制了其在资源有限环境下的应用。为此,研究人员提出了模型蒸馏和模型量化两种关键技术。 模型蒸馏通过将大型教师模型的知识传递给小型学生模型,利用软标签指导训练,使学生模型在保持较高准确性的同时显著减少计算需求,特别适用于移动设备和嵌入式系统。 模型量化则是通过降低模型权重的精度(如从32位浮点数到8位整数),大幅减少模型大小和计算量,提高运行速度,并能更好地适应低配置设备。量化分为后训练量化和量化感知训练等多种方法,各有优劣。
|
11月前
|
存储 开发者
HashMap和Hashtable的key和value可以为null吗,ConcurrentHashMap呢
HashMap的key可以为null,value也可以为null;Hashtable的key不允许为null,value也不能为null;ConcurrentHashMap的key不允许为null
|
11月前
|
安全 API
vite 中配置代理
【10月更文挑战第5天】
1611 61
|
Linux
Linux通过QQ邮箱账号使用mailx发送邮件
Linux通过QQ邮箱账号使用mailx发送邮件
544 2
|
Go Windows
golang hello 安装环境异常【已解决】
golang hello 安装环境异常【已解决】
272 1
|
前端开发 API SEO
vue-router原理以及两种模式区别
vue-router原理以及两种模式区别
214 1
|
SQL BI HIVE
【Hive SQL 每日一题】统计用户留存率
用户留存率是衡量产品成功的关键指标,表示用户在特定时间内持续使用产品的比例。计算公式为留存用户数除以初始用户数。例如,游戏发行后第一天有10000玩家,第七天剩5000人,第一周留存率为50%。提供的SQL代码展示了如何根据用户活动数据统计每天的留存率。需求包括计算系统上线后的每日留存率,以及从第一天开始的累计N日留存率。通过窗口函数`LAG`和`COUNT(DISTINCT user_id)`,可以有效地分析用户留存趋势。
1108 1
|
机器学习/深度学习 编译器 Linux
Python程序开发——第一章 基本python语法(上)
Python程序开发——第一章 基本python语法
Python程序开发——第一章 基本python语法(上)
|
域名解析 网络协议 搜索推荐
阿里云DNS常见问题之获取不到用户真实IP地址如何解决
阿里云DNS(Domain Name System)服务是一个高可用和可扩展的云端DNS服务,用于将域名转换为IP地址,从而让用户能够通过域名访问云端资源。以下是一些关于阿里云DNS服务的常见问题合集: