问题

我了解JSON,但不是JSONP. 维基百科的JSON文档是JSONP的热门搜索结果.它说:

JSONP or "JSON with padding" is a JSON extension wherein a prefix is specified as an input argument of the call itself.

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

第2个搜索结果来自某个名为 Remy ,他撰写了关于JSONP的信息:

JSONP is script tag injection, passing the response from the server in to a user specified function.

我可以理解,但它仍然没有任何意义.


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


附录:我刚刚创建了 JSONP的新页面维基百科;它现在基于 jvenema 的答案,对JSONP进行了清晰而详尽的描述.



解决方法

其实不太复杂...

假设您正在网域example.com上,并且想要向网域example.net提出要求.为了做到这一点,你需要跨越域边界,在大多数浏览器中是一个no-no.

绕过此限制的一个项目是< 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是更好的选择.




相关问题推荐