JSON – 什么是JSONP?

我理解JSON,但不了解JSONP。维基百科关于JSON的文档是JSONP的最佳搜索结果。它说:

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

咦?什么电话?这对我没有任何意义。JSON是一种数据格式。没有电话。

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

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

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


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


附录:我刚刚在维基百科上为JSONP创建了一个新页面 ; 根据jvenema的回答,它现在对JSONP进行了清晰而全面的描述。


它实际上并不太复杂……

假设您在域example.com上,并且您想向域example.net发出请求。要做到这一点,你需要跨越域边界,在大多数浏览器领域都是禁忌。

绕过此限制的一项是<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);
};

现在,当加载脚本时,它将被评估,并且您的函数将被执行。Voila,跨域请求!

值得注意的是JSONP的一个主要问题:您失去了对请求的大量控制权。例如,没有“好的”方法来获取正确的故障代码。结果,您最终使用计时器来监视请求等,这总是有点怀疑。JSONRequest的提议是允许跨域脚本编写,维护安全性以及允许对请求进行适当控制的绝佳解决方案。

这些天(2015年),CORS是推荐的方法与JSONRequest。JSONP对于较旧的浏览器支持仍然有用,但鉴于安全隐患,除非您没有选择,否则CORS是更好的选择。

添加评论

友情链接:蝴蝶教程