资讯专栏INFORMATION COLUMN

想知道jsonp到底是怎么实现的?看我,包教会!

Edison / 3008人阅读

摘要:不管你好不好,反正我是番茄酱。例如我们要请求的地址是获取用户信息后台应该返回给我们的数据是番茄酱也就是说我们最终需要的是服务器把格式的数据给我们。于是后台返回给我们番茄酱于是代码就相当于是番茄酱最终结果与相同。

不管你好不好,反正我是番茄酱。为啥要写这篇文章呢,因为我想写。

看这个文章的你肯定是想学会jsonp吧(废话),那遇到这个文章是你的福气。我敢保证这是全网最容易看懂的文章。当然,你如果不会写js,不懂什么叫跨域,那就算了。别勉强了,勉强是没有幸福的(而且你也没有学习jsonp实现方法的必要)。

首先声明,这篇文章不涉及后台代码的具体实现,关于后台的部分只说思路。

好啦,那我们开课啦!

总的实现思路

我这篇教程的结构是总-分-总(瞎扯的,实际上是总-随意-随意-...-随意)。我们先来说说总的实现思路。

我们都知道由于“同源策略”(不懂啥是同源策略没关系,反正你知道有跨域现象就行了),而导致我们跨域的ajax请求发送失败,浏览器报错。

但是呢script标签的src是没有跨域一说的,也就是说你可以随便引用别的网站的js。这就是总的实现思路。如果不理解这一点,也不用往下看了,因为你以你的知识储备和理解能力不合适看这文章。

说完总的实现思路,我们来看具体怎么做吧。

1:先忘记我们要实现jsonp

先忘了我们的目标,看一下我们需要完成jsonp而需要掌握的知识。先理解了这些,才能理解jsonp的实现。

1.1:基础的js代码

我们在页面写个这样的代码:


运行结果:

对于代码和结果没有异议吧。为啥我要写这样的函数。我要说明的是这样一点:后一个script标签里的代码可以引用前一个script代码里的函数(全局)。老规矩,理解了这点就继续往下看。

1.2:script标签引用文本

我们在html里写这样的代码:

然后我们在同路径下新建一个a.txt。并且a.txt里的文本如下:

a();

然后我们在html里引用a.txt。完整的代码如下:


刷新页面,控制台如下:

也就是说txt里的代码被执行了。所以a函数才会被执行。我要说明的是:scritpt标签引用的外部文件中的文本内容会被当成js来解析。

也就是说相当于是这样的代码:


1.3:后台返回文本

如果我们的后台给我们返回的不是数据,而是跟a.txt一样的文本如下文本:

a();

如我们请求地址为:https://www.a.com/a。则我们此时的完整代码为:


那可以预见,最终的结果会与1.2一致。因为也等于是如下的代码:


小结

以上的东西只是需要完成jsonp要懂的知识。你理解了可以继续往下看。先不要深究“这样怎么能实现”的问题。不要急,我后面会说的。如果不理解上面的知识可以多看几遍。能够自己动手实验最好。

2:再看看一般的ajax请求

我们一般的ajax请求,是后台给我们一个请求地址,我们发送请求,然后后台返回给我们json格式的信息。例如我们要请求的地址是:

https://www.a.com/userInfo (获取用户信息)

后台应该返回给我们的数据是:

{
  "name": "番茄酱",
  "wechat": "fan_qie_jiang666",
  "qq": "1164431166",
  "email": "1164431166@qq.com"
}

也就是说我们最终需要的是服务器把json格式的数据给我们。但是我们用1里说的方法,虽然服务器能调用我们本地的函数,但是我们怎么能获取到数据呢?

那这样,我们把1.3的html代码改成这样:



服务器返回的文本改成这样:

a({
    "name": "番茄酱",
    "wechat": "fan_qie_jiang666",
    "qq": "1164431166",
    "email": "1164431166@qq.com"
});

也就是相当于这样的代码:



最终结果:

也就是说我们获取到了我们需要的数据。但是万一我们的function不叫a,或者原本叫a,但是因为种种原因需要改名,这样后台也要跟着改代码。这增加了沟通成本,也增加了后台的工作量。并且可能每个接口你们都需要去沟通这个函数的名字。这是问题呀!

3.解决函数名的问题

用script标签里的src相当于向服务器发送了get请求。

不管你理不理解上面这点,记住就行了。既然是相当于get请求,那就可以带参。并且后台也能获得这个参数的值。

既然这样那我们是不是跟后台沟通好我们给所有用jsonp的请求弄个参数,这个参数的值是我们本地的函数名。后台直接给我们返回函数名然后参数为数据值就ok辣?不理解的话看下面的过程。

比如我们和后台沟通好参数名叫balabala,那代码就像下面这样:



后台收到了这个请求,不再像之前那样直接返回给我们a(...)。

因为我们已经说好了,函数名不再是固定的a,而是balabala这个参数的值才是我们的函数名。

于是后台去获取balabala这个参数的值,获取到的是xiaoMoXian。于是后台返回给我们:

xiaoMoXian({
    "name": "番茄酱",
    "wechat": "fan_qie_jiang666",
    "qq": "1164431166",
    "email": "1164431166@qq.com"
});

于是代码就相当于是:



最终结果与2相同。

小结

以上就是jsonp的实现过程。我们已经完成了不用ajax来请求,而利用script标签src属性的跨域特性,来实现我们获取数据的目的。

我来小结下我们用到的知识点:

ajax请求受同源策略的影响不能跨域。(问题)

script标签的src是可以跨域的,不受同源策略的影响。(总的方法)

后一个script标签里的代码可以引用前一个script代码里的函数。

scritpt标签引用的外部文件中的文本内容会被当成js来解析。(结合3可以获取数据)

用script标签里的src相当于向服务器发送了get请求。(解决函数名的问题)

看到这并且看懂就说明你已经差不多可以毕业了。因为你已经完全懂了jsonp怎么实现的。可是我们一般用jsonp好像没这么麻烦呀,也不用专门去写个函数来给后台调用,也不用去写script标签写src到我们的请求地址,也不用沟通什么参数名。哪像你说的这么麻烦!?

哈哈,我要加班啦。预知后事如何,请多点赞。赞够多我就更。

或者加我微信给我发1块钱红包,众筹到10元我就更(谁还没个身价了 ̄へ ̄)。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/109111.html

相关文章

  • 前端经典文章

    摘要:上周末看这篇文章时,偶有灵光,所以,分享出来给大家一起看看前端面试四月二十家前端面试题分享请各位读者添加一下作者的微信公众号,以后有新的文章,将在微信公众号直接推送给各位,非常感谢。 前端切图神器 avocode 有了这个神器,切图再也腰不酸,腿不疼了。 这一次,彻底弄懂 JavaScript 执行机制 本文的目的就是要保证你彻底弄懂javascript的执行机制,如果读完本文还不懂,...

    lowett 评论0 收藏0
  • 前端面试分享: 两年经验社招-阿里巴巴

    摘要:作者两年经验第一家任职的是个小公司第二家算是二线互联网公司各待了一年吧能有机会去阿里面试很惊喜先来和大家分享一下面试经历电话面试初探因为还在职的缘故电话面试从晚上点钟开始持续了半个小时左右一开始的时候特比紧张甚至声音略有些颤抖简单自我介绍做 作者两年经验, 第一家任职的是个小公司, 第二家算是二线互联网公司, 各待了一年吧... 能有机会去阿里面试很惊喜! 先来和大家分享一下面试经历....

    JowayYoung 评论0 收藏0
  • JSONP原理剖析

    摘要:运行一下页面,成功弹出提示窗口,的执行全过程顺利完成到这里为止的话,相信你已经能够理解的客户端实现原理了吧剩下的就是如何把代码封装一下,以便于与用户界面交互,从而实现多次和重复调用。 先说说JSONP是怎么产生的: 其实网上关于JSONP的讲解有很多,但却千篇一律,而且云里雾里,对于很多刚接触的人来讲理解起来有些困难,小可不才,试着用自己的方式来阐释一下这个问题,看看是否有帮助。 1、...

    DangoSky 评论0 收藏0
  • 前端相关大杂烩

    摘要:希望帮助更多的前端爱好者学习。前端开发者指南作者科迪林黎,由前端大师倾情赞助。翻译最佳实践译者张捷沪江前端开发工程师当你问起有关与时,老司机们首先就会告诉你其实是个没有网络请求功能的库。 前端基础面试题(JS部分) 前端基础面试题(JS部分) 学习 React.js 比你想象的要简单 原文地址:Learning React.js is easier than you think 原文作...

    fuyi501 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<