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的问题。而解决请求是跨域的思路就是之前总结的两种:一种是要服务器支持跨域,一种是在前台调用的时候隐藏跨域。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。