Hi~我是Tom,今天咱们来聊聊面试官很喜欢问,可是平时开发又没什么卵用的JSONP请求吧😫javascript
JSONP是JSON with Padding的略称,JSONP为民间提出的一种跨域解决方案,经过客户端的script标签发出的请求方式。html
那请求何须作得如此麻烦,直接使用ajax作请求岂不美哉,这里便要涉及到一个同源和跨域的问题,往下。java
同源策略,它是由Netscape网景公司提出的一个著名的安全策略。
复制代码
如今全部支持JavaScript 的浏览器都会使用这个策略。所谓同源是指,域名,协议,端口相同。面试
而全部非同源的请求(即 域名,协议,端口 其中一种或多种不相同),都会被做为跨域请求,浏览器会将其非同源的响应数据丢弃。ajax
这里能够理解为是浏览器在搞事情,服务端确确实实有返回数据,浏览器接收到返回的数据,发现咱们请求的是一个非同源的数据,浏览器再将其响应报文丢弃掉。json
而经过一些标签发出的请求则不会被进行同源检查,好比script标签,img标签等等,本文讲述JSONP即是经过script标签作的请求。后端
在发请求先,准备一个全局的接收函数跨域
window.myCallback = (res)=>{ //声明一个全局函数 'callback',用于接收响应数据
console.log(res)
}
复制代码
在html建立script标签,发出请求浏览器
<html>
....
<script> window.myCallback = (res)=>{ //这里为上一步定义的全局函数 console.log(res) } </script>
<script url="xxx?callback=myCallback"> //script标签的请求必须在写在定义全局函数以后 //这里需将全局函数的函数名做为参数callback的value传递 //这里callback这个键名是先后端约定好的 </script>
</body>
</html>
复制代码
服务端接收到请求,将以下数据相应回安全
myCallback({ //一个函数的调用,将数据做为参数传递进去,再将整个函数的调用返回给客户端
name:'ahreal',
age:18
})
复制代码
客户端接收到服务端的相应,至关于:
<html>
....
<script> window.myCallback = (res)=>{ //这里为上一步定义的全局函数 console.log(res) } </script>
<script> //将接收到的数据做为script标签里面的内容展开执行 myCallback({ name:'ahreal', age:18 }) </script>
</body>
</html>
复制代码
控制台输出
到这里,JSONP的相关概念,已经阐述完毕,面试官问你JSONP请求的时候,两步走,1. JSONP是什么 2. JSONP怎么作。
面试官:说说JSONP请求吧。
我:JSONP请求首先是为了解决跨域问题而存在的一种民间解决方案balabala...
浏览器存在同源安全机制balabala...
经过标签的形式发请求balabala...
须要和后端同窗进行约束balabala...
只能使用get请求balabala...
复制代码
答道这里JSONP这道题你已经回答了80分了,若是这时候你可以蹦出一句:
emm...我曾经使用原生js封装过一个jsonp的插件,balabala...
复制代码
那么你将会是100分的回答,那不少同窗可能会问,
但是我没封装过JSONP的插件啊喂!
复制代码
别着急,我为你准备了另一篇封装JSONP请求插件的博客,里面完整的阐述了思路和代码的实现。我很是建议你好好读一下,这将对你学习JSONP的请求有巨大的帮助。
End