为啥我的 REST API 客户端需要 JSONP 请求?

Posted

技术标签:

【中文标题】为啥我的 REST API 客户端需要 JSONP 请求?【英文标题】:Why my REST API clients need JSONP request?为什么我的 REST API 客户端需要 JSONP 请求? 【发布时间】:2012-11-06 10:39:41 【问题描述】:

我在 MVC 4 中创建了 REST 基础 webAPI 并托管在服务器上,当我从其他域上的 html 和我的本地 pc 上调用它时,我需要将它调用为 JSONP 请求,例如 put callback=?在 url 中,所以它可以是 jsonp。我的问题是为什么会这样?如果它是由于跨域,那么 google 和 facbook 和其他公司如何托管他们的 api 我们也从我们自己的域调用它,但我们不保留回调 =?在他们的网址中。

那么为什么我的 API 需要回调=?如果我从其他域或使用简单的 jquery html 在我的本地 PC 上调用它,则在 url 中。

【问题讨论】:

【参考方案1】:

这是因为浏览器强加的同源策略。 看 http://www.w3.org/Security/wiki/Same_Origin_Policy

http://en.wikipedia.org/wiki/Same_origin_policy

。 另请注意,未来 CORS 可能是比 JSONP 更好的选择

http://en.wikipedia.org/wiki/Cross-origin_resource_sharing

编辑:------------

如果您浏览了上述链接,您会看到 JSONP 允许用户绕过浏览器强加的同源策略安全措施。

诀窍是浏览器允许标签引用源域以外的其他域中的文件。

基本上,使用 JSONP 会发生什么,您将回调函数名称发送到附加到查询字符串的服务器。然后服务器将通过调用此函数来填充或前缀它是 JSON 请求,因此名称中表示响应的 P 被填充或前缀。

例如,您可以创建一个脚本标签,如

那么目标服务器,应该发送一个这样的响应

mymethod(normal: 'json response')

当在客户端评估此响应时(与任何其他 javascript 文件一样),它将使用来自该服务器的 JSON 响应有效地调用您的方法。

但是,这只能做 GET 请求。

如果您想发出 POST (PUT/DELETE) 请求,您需要使用 CORS,其中服务器需要预先设置特定的标头。

Access-Control-Allow-Origin: www.ext.site.com

希望这会有所帮助。

【讨论】:

那么它为什么对其他人有用,例如我们调用 twitter api 来使用 jquery 获取推文......那么为什么我不能在我的域上托管而其他用户可以使用我的 api 来获取一些信息/数据。【参考方案2】:

因为同源政策的限制。同源策略防止从一个域加载的脚本从另一个域获取或操作文档的属性。即请求的 URL 的域必须与当前网页的域相同。这基本上意味着浏览器将来自不同来源的内容隔离开来,以防止它们被操纵。

【讨论】:

用户无法理解的是跨站点脚本有问题,而是在寻找可行的解决方案

以上是关于为啥我的 REST API 客户端需要 JSONP 请求?的主要内容,如果未能解决你的问题,请参考以下文章

REST - Jersey - 提供跨站点访问

Angular JSONP 调用 WordPress JSON REST API

如何通过 JSONP 或 HTTP 代理访问 Rally REST API 的 JSON 响应?

为啥 Postman 找不到我的 Spring REST API?

java开发 Rest 接口怎样设计api_key 也就是我的api怎样才能不被自由访问,需要在header加入验证

基于浏览器的 REST api 身份验证