jsonp 是一个非官方协议,它是一个约定。它约定了我请求的参数里面如果包含指定的参数(默认是 callback)的话这就是一个 jsonp 请求。
工作机制:在发送请求的时候加了一个 callback 的参数,后台发现有 callback 参数就知道这是一个 jsonp 请求,然后他就会把返回的对象有 json 变为 javascript,而 javascript 的内容就是一个函数调用。内容里,callback 的值做为函数名,返回的数据作为函数的参数。
普通 ajax 请求和 jsonp 请求的区别:
type 不一样
普通 ajax 请求发出去 type 是 xhr 的,而 jsonp 请求发出去的 type 是 script, 因为不是 xhr 类型,所以浏览器就不会做校验。
返回的类型不一样。
普通的 ajax 请求返回的类型是 json 对象,而 jsonp 里面返回的类型是 js 脚本。
url 不同
jsonp 的 url 里面会有一个 callback 的参数。callback 参数就是前后台之间的一个约定(参数名不是必须是 callback, 只要前后台保持一致就行)。
jsonp 的弊端:
服务器需要改动代码来支持
jsonp 实现跨域后台服务器是需要做改动的,前后台的参数要保持一致。但是如果你要调用的接口不是自己公司的代码,那 jsonp 就无能无力了。
只支持 get 方法
他的原理是通过动态的创建 script 的方法来实现跨域。script 只支持 get 方法
发送的不是 XHR 请求
XHR 请求有很多新的特性,比如异步,各种事件,而这些 jsonp 都不支持。
总结:
我们解决跨域问题的最好方法还是要从解决请求是跨域的这个角度去解决,而不是解决请求是 xhr 的问题。而解决请求是跨域的思路就是之前总结的两种:一种是要服务器支持跨域,一种是在前台调用的时候隐藏跨域。