为什么我可以从浏览器而不是Angular的资源中发出REST API请求?

时间:2016-04-27 04:54:06

标签: angularjs cors

问题是: 为什么我可以从浏览器/ Postman /甚至Node.js(http.get方法)发出REST API请求,而不是从Angular的资源发出?

错误消息的片段是:

XMLHttpRequest cannot load http://example-of-external-api-site.com 
Response to preflight request doesn't pass access control check: No 'Access-Control-Allow-Origin' header is present on the requested resource.
Origin 'http://localhost' is therefore not allowed access.

在问这个之前,我试着看一下CORS的定义。根据我的理解,我可以理解为什么它不允许我从Angular的资源中提出请求,因为它来自不同的域。但是,我的浏览器/ Postman / Node.js应用程序是不是来自不同的域?

请帮我解答一下,我真的不明白为什么......

1 个答案:

答案 0 :(得分:2)

如果在直接访问网址时从浏览器发出请求,则表示您在不使用XMLHttpRequest的情况下请求网址内容。

$http.get()有两种情况:

当访问与托管AngularJS内容不同的域的uri时,通过使用浏览器呈现内容中的XMLHttpRequest的ajax调用,您必须提供与白名单匹配的CORs标头目标服务器。这是由于浏览器安全限制,以防止恶意的恶意攻击,如Cross Site Scripting。

当访问与托管AngularJS内容的域相同的域(通常通过相对路径完成:/Api/1而不是http://domain.com/api/1)时,不需要CORs白名单,因为两者都是原点和目标域是相同的。

最后,当从节点调用url时,您正在进行服务器到服务器的并发调用,该调用没有相同的安全限制,因为它没有在您的浏览器中执行。