0

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

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

4

2 回答 2

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

希望这可以帮助。

于 2012-11-18T06:41:17.430 回答
0

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

于 2012-11-18T06:39:56.950 回答