AngularJS $ http.head显示状态代码为0,尽管成功响应200

时间:2015-07-21 13:05:45

标签: angularjs

我正在编写一个带有链接的指令,发出一个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)
            }
          )
      }
});

在控制台打开的情况下全屏打开预览,您就可以看到我的意思......

Status code of 200, with angular's error showing a status code of 0

有人知道为什么会这样吗?这是AngularJS中的错误吗?为什么AngularJS不会显示浏览器正在接收的状态代码? 谢谢!

2 个答案:

答案 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