JSONP为什么不支持POST请求?

求详解,差了很多解释太简单了,不明白。。

阅读 12.9k
5 个回答

JSONP的最基本的原理是:动态添加一个<script>标签,而script标签的src属性是没有跨域的限制的。这样说来,这种跨域方式其实与ajax XmlHttpRequest协议无关了。
可以说jsonp的方式原理上和<script src="http://跨域/...xx.js"></script>是一致的,因为他的原理实际上就是 使用jsscript标签 进行传参,那么必然是get方式的了,和浏览器中敲入一个url一样

JSONP原理

预先定义callback函数

function myfunc(data) {
   console.log(data)
}

dom中插入script标签

<!-- callback参数对象对应上面callback函数名 -->
<script src="//example.com/jsonp.js?callback=myfunc"></script>

浏览器请求//example.com/jsonp.js?callback=myfunc, 得到内容

myfunc({"foo": "bar"}) //数据传入到了callback函数

本质上是通过script标签获取数据, script标签是只支持GET的

jsonp的本质就是动态生成一个script scr指向目标url
取回形如
xxx({"key1":"value1","key2":"value2"})的js并执行

在这之前你得先定义一个叫xxx方法
比如
const xxx=(...rest)=>console.log(rest);
从而获取到你所谓的jsonp过程想传递的信息。
那么现在问题就变成了script标签引入js的http请求能不能为post 显然答案是否定的

通过标签获取数据!
通过标签获取数据!
通过标签获取数据!
(跟我读三遍!)

JSONP 的本质是动态向页面中插入一个 script 标签加载跨域内容,显然这种办法没办法由 POST 实现。
如果你用post、XmlHttpRequest就一定会去检查是否跨域!

楼上这个说的挺通俗的:
<script src="http://跨域/...xx.js"></script>

引申: 跨域技术里面有个方法叫图像 Ping,图片通过src可以在你网站域名下访问任何网站的图片地址。一个道理

光理解概念没用, 你要理解它的由来.
jsonp 本来就不是一项语言标准, 而是一个供求双方的补偿约定. 这个是问题的本质, 你说理解不了的话从这个含义入手, 很多东西就水到渠成了.
包括为什么用 <scritp src="xxx?callback=foo"></script> 这种形式, 还有为什么不是你说的 post 等.
这是个以小见大的 接口设计/定义/补偿/约定.
算了, 如果不明白你就当我胡说吧

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏