ChatGPT解决这个技术问题 Extra ChatGPT

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

我了解 JSON,但不了解 JSONP。 Wikipedia's document on JSON 是(曾经)JSONP 的热门搜索结果。它是这样说的:

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

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

2nd search result 来自某个名叫 Remy 的人,他写了以下关于 JSONP 的文章:

JSONP 是脚本标签注入,将来自服务器的响应传递给用户指定的函数。

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

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

附录:我刚刚在 Wikipedia 上创建了 a new page for JSONP;根据 jvenema 的回答,它现在对 JSONP 进行了清晰而全面的描述。

作为记录,如果您不信任您正在与之交谈的服务器 100%,请不要使用 JSONP。如果它受到损害,您的网页将受到微不足道的损害。
另请注意,如果未正确实施 JSONP can be hijacked
我想感谢 JSONP 的作者,他给出了它背后的理念:Bob Ippolito's archive on JSONP。他将 JSONP 介绍为“用于跨域数据获取的脚本标记方法的新技术不可知标准方法”。
对于那些可能通过搜索其他东西十多年后到达这里并感到困惑的人:JSON-P 现在也是用于处理 JSON 的 Java API 的名称,主要是解析和编写它。它反映了 XML StAX 和 DOM API,分别用于流式输入/输出和文档建模。它支持用于查询的 JSON 指针,例如用于 XML 的 XPath。我认为它还打算提供通过 JSON Patch 转换 JSON 的方法,例如带有 XSLT 的 XML 和 Java XML Transformer API,但它仍然不如 XSLT 先进。这个问题是关于脚本注入的。

R
Rahul Gupta

其实也不是很复杂...

假设您在域 example.com 上,并且想要向域 example.net 发出请求。为此,您需要跨域边界,这是大多数浏览器领域中的no-no

绕过此限制的一项是 <script> 标记。当您使用脚本标签时,域限制会被忽略,但在正常情况下,您无法对结果真正任何操作,脚本只会被评估。

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

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

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

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

{ foo: 'bar' }

然而,使用 JSONP,当服务器接收到“回调”参数时,它会稍微不同地包装结果,返回如下内容:

mycallback({ foo: 'bar' });

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

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

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

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

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


请注意,使用 JSONP 有一些安全隐患。由于 JSONP 是真正的 javascript,它可以做 javascript 可以做的所有事情,因此您需要信任 JSONP 数据的提供者。我在这里写了一篇关于它的博客文章:erlend.oftedal.no/blog/?blogid=97
JSONP 中是否真的存在