我在MVC 4中创建了REST基础webAPI并在服务器上托管,当我从其他域上的HTML和本地PC上调用它时,我需要将其称为JSONP请求,如put call =?在url所以它可以是jsonp。我的问题是为什么会这样?如果它是由于跨域然后如何谷歌和facbook和其他公司托管他们的api我们也从我们自己的域名称,但我们不保持回调=?在他们的网址中。
那么为什么我的API需要回调=?如果我使用简单的jquery html从其他域或我的本地PC上调用它,请在url中。
答案 0 :(得分: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允许用户解决浏览器强加的同源策略安全措施。
Trick是浏览器允许标签引用除原点以外的其他域中的文件。
基本上发生的是JSONP,您将回调函数名称发送到附加到查询字符串的服务器。然后服务器将通过调用此函数来填充或加上其他JSON请求的前缀,因此表示响应的名称中的P将被填充或加前缀。
例如,您可以创建一个脚本标记
然后目标服务器应该发送一个响应
mymethod({normal: 'json response'})
当在客户端评估此repsone时(与任何其他javascript文件一样),它将使用来自该服务器的JSON响应有效地调用您的方法。
但是,这只能执行GET请求。
如果你想发出POST(PUT / DELETE)请求,你需要使用CORS,服务器需要事先设置一个特定的标题。
Access-Control-Allow-Origin: www.ext.site.com
希望这有帮助。
答案 1 :(得分:0)
由于同源政策的限制。同源策略可防止从一个域加载的脚本从另一个域获取或操作文档的属性。也就是说,请求的URL的域必须与当前Web页面的域相同。这基本上意味着浏览器隔离来自不同来源的内容以防止它们被操纵。