一尘不染

什么是JSONP,为什么创建它?

json

我了解JSON,但不了解JSONP。Wikipedia上有关JSON的文档是JSONP的最高搜索结果。它说:

JSONP或“带填充的JSON”是JSON扩展,其中将前缀指定为调用本身的输入参数。

??什么电话 这对我来说毫无意义。JSON是一种数据格式。没有电话

第二个搜索结果是由某些人叫雷米,谁写的这个约JSONP:

JSONP是脚本标记注入,它将响应从服务器传递到用户指定的函数。

我可以理解这一点,但这仍然没有任何意义。


那么JSONP是什么?为什么创建它(它解决了什么问题)?我为什么要使用它?


附录 :我刚刚在Wikipedia
上为JSONP创建了一个新页面。根据jvenema的回答,它现在对JSONP有了清晰而透彻的描述。


阅读 315

收藏
2020-07-27

共1个答案

一尘不染

实际上并不太复杂…

假设您正在使用域 example.com ,并且想向域发出请求 example.net 。要做到这一点,你需要 跨域
边界,一个 没有没有 在大多数browserland的。

绕过此限制的一项是<script>标签。使用脚本标记时,将忽略域限制,但是在正常情况下,您实际上无法对结果 执行
任何操作,只是对脚本进行了评估。

输入 JSONP
。当您向启用JSONP的服务器发出请求时,您将传递一个特殊参数,该参数告诉服务器有关您页面的一些信息。这样,服务器就可以用页面可以处理的方式很好地包装其响应。

例如,假设服务器需要一个名为的参数 callback 来启用其JSONP功能。然后您的请求将如下所示:

http://www.example.net/sample.aspx?callback=mycallback

没有JSONP,这可能会返回一些基本的JavaScript对象,如下所示:

{ foo: 'bar' }

但是,使用JSONP,当服务器接收到“ callback”参数时,它会以不同的方式包装结果,返回如下所示:

mycallback({ foo: 'bar' });

如您所见,它现在将调用您指定的方法。因此,在页面中,您定义了回调函数:

mycallback = function(data){
  alert(data.foo);
};

现在,加载脚本后,将对其进行评估,然后将执行您的函数。瞧,跨网域要求!

值得注意的是JSONP的一个主要问题:您失去了对请求的大量控制。例如,没有“不错”的方法来找回正确的故障代码。结果,您最终会使用计时器来监视请求等,这总是让人怀疑。JSONRequest的主张是一个很好的解决方案,它允许跨域脚本编写,维护安全性并允许对请求的适当控制。

如今(2015年),与JSONRequest相比,CORS是推荐的方法。JSONP对于较旧的浏览器支持仍然有用,但是考虑到安全隐患,除非您别无选择,否则CORS是更好的选择。

2020-07-27