为什么jsonp只支持get请求?JSONP是同步还是异步

JSONP的原理

JSONP 是一种【请求一段 JS 脚本,把执行这段脚本的结果当做数据】的玩法。

所以,你能 POST 一段通过 script 标签引入的脚本吗?

(如果看过 JSONP 库的源码就知道,常见的实现代码其实就是 document.createElement(‘script’) 生成一个 script 标签,然后插 body 里而已。在这里根本没有设置请求格式的余地)。

所以JSONP的实现原理就是创建一个script标签, 再把需要请求的api地址放到src里. 这个请求只能用GET方法, 不可能是POST

JSONP的例子一

域名A中的JS代码AJAX请求域名为B的服务器数据,这就是跨域AJAX请求,默认情况下是不行的。

但是HTML中有地方可以跨域请求,比如img script标签,它们的src属性指向的地址可以是不在域名A下的(即跨域)。

那有人就利用了上面的特点,选择了script中src能够跨域获得内容的特性,研究出了JSONP这种hack协议。(src中请求都是GET)

那假设JSONP请求如下:

jsonp({
    url: 'http://path/to/server/b',
    params: {A: a, B: b},
    success: function myCallback (response) {}
})

背后其实在进行:

1.拼接一个script标签,,从而触发对指定地址的GET请求
2.那服务器端对这个GET请求进行处理,并返回字符串 “myCallback(‘response value’)”
3.那前端script加载完之后,其实就是在script中执行myCallback(‘response value’)
4.是不是就完成了跨域的请求,
5.是不是就是只能用GET

所以jsonp不会对服务器端代码或者内容做更改,因为它只能发送get请求

转自:https://segmentfault.com/q/1010000009708151

JSONP的例子二

一、JSONP

由于同源策略不会阻止动态脚本的插入到文档中去,所以催生出了一种很常用的跨域方式: JSONP(JSON with Padding)。

原理说起来也很简单:

假设,我们源页面是在a.com,想要获取b.com的数据,我们可以动态插入来源于b.com 的脚本:

script=document.createElement("script");  
script.type="text/javascript";  
script.src="http://www.b.com/getdata?callback=demo";  
function demo(data) {  
  console.log(data.msg);  
}  

这里,我们利用动态脚本的src属性,变相地发送了一个http://www.b.com/getdata?callback=demo的GET请求。这时候,b.com页面接受到这个请求时,如果没有JSONP,会正常返回json的数据结果,像这样:

{msg:"helloworld"}  

而利用JSONP,服务端会接受这个callback参数,然后用这个参数值包装要返回的数据:

demo({msg:"helloworld"});  

这时候,如果a.com的页面上正好有一个demo 的函数:

function demo(data) {  
  console.log(data.msg);  
}  

当远程数据一返回的时候,随着动态脚本的执行,这个demo函数就会被执行。

到这里,你应该能明白这个技术为什么叫JSONP了吧?就是因为使用这种技术服务器会接受回调函数名作为请求参数,并将JSON数据填充进回调函数中去。

JSONP的优缺点

虽然JSONP在跨域ajax请求方面有很强的能力,但是它也有一些缺陷。

首先,它没有关于JSONP调用的错误处理,一旦回调函数调用失败,浏览器会以静默失败的方式处理。

其次,它只支持GET请求,这是由于该技术本身的特性所决定的。因此,对于一些需要对安全性有要求的跨域请求,JSONP的使用需要谨慎一点了。

由于JSONP对于老浏览器兼容性方面比较良好,因此,对于那些对IE8以下仍然需要支持的网站来说,仍然被广泛应用。不过,针对高级浏览器,建议还是使用接下来会介绍的CORS 方法。

JSONP是同步还是异步

首先搞清楚,在软件开发领域,在前端领域,同步和异步的概念分别是什么。

我在wikipedia上找到一个解释。其实可以简单的理解为:能立刻得到结果的,不影响代码顺序执行的,都是同步的。反之,都是异步的。

alert, confirm, prompt都需要较长时间执行,但它们并不影响代码顺序执行,所以,它们是同步的。

setTimeout, setInterval, ajax等网络请求方式,这些都是需要回调函数的,不能立刻得到结果,而且也不阻塞代码顺序执行,所以这些都是异步的。

再来看什么是jsonp:

jsonp可以理解为从网络加载的一段脚本,不是表达式,而是语句。通常的表现形式为,在请求的URL中传入一个要执行的函数的方法名,而在应答中调用这个方法。

所以,jsonp是异步的,并且是可以跨域请求的异步

JSONP异步的理解

ajax其实用它主要就是因为它的异步,它去服务器端取数据,html页面可以在它取数据期间接着走下面的,等ajax取回数据了再处理;

jsonp也是利用回调函数,去指定服务器上取数据的时候不用等待,等它取回来了直接用回调函数一处理,也达到了异步的效果呀

JSONP异步的例子

你可以试试写个内容如下的a.js

alert('a')

然后

var scn = document.createElement('script');
scn.src = 'a.js';
document.getElementsByTagName('head')[0].appendChild(scn);
alert('b');

看看执行顺序是先a后b
还是先b后a
就知道是同步异步
你还可以在以上代码中加入async 来看看是否造成差异
执行结果是先b后a

参考:https://www.zhihu.com/question/35892596

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值