为什么我的REST API客户端需要JSONP请求



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

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

这是因为浏览器强加的同源策略。看见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'})

当这个repsone在客户端进行评估时(对于任何其他javascript文件),它将使用来自该服务器的JSON响应有效地调用您的方法。

但是,这只能执行GET请求。

若要发出POST(PUT/DELETE)请求,则需要使用CORS,服务器需要在CORS中预先设置特定的标头。

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

希望这能有所帮助。

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

最新更新