我正在编写一个带有链接的指令,发出一个HEAD请求来检查该链接是否返回200代码,如果是,则将该链接粘贴到iframe src中。
但是,我发现的是$ http给了我错误,尽管我的chrome& amp; firefox调试器显示服务器响应状态代码为200。
Plnkr在这里证明: http://plnkr.co/edit/dgn5E8u3WYijd73kKtAz?p=preview
angular.module('testHead', [])
.controller('testHeadController', function($http) {
var vm = this;
vm.results = "waiting";
vm.getHead = function() {
$http.head('http://www.apple.com/')
.then(
function(response) {
console.log("response", response)
},
function(error) {
console.log("error", error)
}
)
}
});
在控制台打开的情况下全屏打开预览,您就可以看到我的意思......
有人知道为什么会这样吗?这是AngularJS中的错误吗?为什么AngularJS不会显示浏览器正在接收的状态代码? 谢谢!
答案 0 :(得分:1)
浏览器成功提取文档。这就是您在开发者控制台中看到200
的原因。
然后,浏览器检查CORS访问权以确定是否允许调用者JavaScript查看响应。 (如果它是Angular.js或其他任何东西都没关系)
在这种情况下,浏览器看不到CORS头,这意味着该域不允许使用ajax的内容。因此,即使浏览器从服务器获得200
,它也会将其作为failed
报告给调用者脚本,因为它不应该被访问。这就是为什么你在浏览器中看到200而在Angular.js中看到0的原因。
只要服务器没有明确允许使用CORS标头,您就无法访问JavaScript中响应的任何部分,包括标头甚至状态。这是设计的。
如果服务器是您的,您可以添加CORS标头以允许请求。
答案 1 :(得分:0)
您已经看到错误:"阻止跨源请求"。这意味着您无法在Javascript中访问其他域中的域,即使使用" Access-Control-Allow-Origin"在HTTP标头中设置。这是服务器端问题。 Apple应该阻止跨域访问。
在您的情况下,您要检查是否可以将网址插入iframe。只需检查返回代码即可。如果它是200,您可以继续将其插入iframe。
顺便说一句,如果您想了解有关HTTP访问控制的更多信息,可以参考此页面。 https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS