问题是: 为什么我可以从浏览器/ 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应用程序是不是来自不同的域?
请帮我解答一下,我真的不明白为什么......
答案 0 :(得分:2)
如果在直接访问网址时从浏览器发出请求,则表示您在不使用XMLHttpRequest
的情况下请求网址内容。
$http.get()
有两种情况:
当访问与托管AngularJS内容不同的域的uri时,通过使用浏览器呈现内容中的XMLHttpRequest
的ajax调用,您必须提供与白名单匹配的CORs标头目标服务器。这是由于浏览器安全限制,以防止恶意的恶意攻击,如Cross Site Scripting。
当访问与托管AngularJS内容的域相同的域(通常通过相对路径完成:/Api/1
而不是http://domain.com/api/1
)时,不需要CORs白名单,因为两者都是原点和目标域是相同的。
最后,当从节点调用url时,您正在进行服务器到服务器的并发调用,该调用没有相同的安全限制,因为它没有在您的浏览器中执行。