【问题标题】:AngularJS $http.head is showing a status code of 0 despite a successful 200 response尽管 200 响应成功,AngularJS $http.head 仍显示状态代码 0
【发布时间】:2015-07-21 23:15:57
【问题描述】:

我正在编写一个指令,它将获取一个链接,发出 HEAD 请求以检查链接是否返回 200 代码,如果返回,则将该链接粘贴到 iframe src 中。

但是,我发现 $http 给了我错误,尽管我的 chrome 和 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 不显示浏览器正在接收的状态码? 谢谢!

【问题讨论】:

  • 浏览器成功获取文档。检查 CORS 访问并决定阻止请求。浏览器向应用程序发送“失败”响应而不是实际文档作为安全功能。这就是为什么您在浏览器中看到 200 而在 Angular.js 中看到 0。
  • 对我来说具有讽刺意味的是,这是一个 HEAD 请求。这意味着我对内容不感兴趣,只对标题感兴趣。我可以看到我已经有了这些,我只是不知道如何在 AngularJS 中找到它们。是的,如果我使用一个我希望从中获得 404 的 url,我会看到 net 选项卡给了我 404 状态代码,但在 AngularJS 中我仍然得到 0。
  • 只要服务器没有明确允许使用 CORS 标头,您就无法访问 JavaScript 中响应的任何部分,包括标头甚至状态。这是设计使然。如果服务器是您的,您可以添加 CORS 标头以允许请求。
  • 所以我可以在 firebug net 选项卡中看到标题和响应代码,但我无法通过 JavaScript 访问它。是时候尝试不同的东西了……谢谢!

标签: angularjs


【解决方案1】:

浏览器成功获取文档。这就是您在开发者控制台中看到200 的原因。

然后,浏览器检查 CORS 访问以决定是否允许调用者 JavaScript 查看响应。 (不管是Angular.js还是别的)

在这种情况下,浏览器看不到 CORS 标头,这意味着该域不允许使用 ajax 的内容。因此,即使浏览器从服务器获得200,它也会将其报告为failed 给调用者脚本,因为它不应该被访问。这就是为什么您在浏览器中看到 200 而在 Angular.js 中看到 0 的原因。

只要服务器没有明确允许使用 CORS 标头,您就无法访问 JavaScript 中响应的任何部分,包括标头甚至状态。这是设计使然。

如果服务器是您的,您可以添加 CORS 标头以允许请求。

【讨论】:

    【解决方案2】:

    您已经看到错误:“跨域请求被阻止”。这意味着您无法在 Javascript 中从另一个域访问域,即使在 HTTP 标头中设置了“Access-Control-Allow-Origin”。这是服务器端问题。 Apple 应该阻止跨域访问。

    在您的情况下,您想检查 URL 是否可以插入到 iframe 中。只需检查返回码就足够了。如果是 200,你可以继续插入到 iframe 中。

    顺便说一句,如果你想了解更多关于 HTTP 访问控制的信息,你可以参考这个页面。 https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS

    【讨论】:

    • 嗨冲。这基本上就是我要问的。 AngularJS 告诉我响应代码是 0,而我可以看到 net 选项卡中的响应代码是 200。我将如何获得“实际”响应代码?
    • 如果是200,你可以把那个URL放到iframe中。它应该工作。不是吗?
    猜你喜欢
    • 2020-10-25
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-22
    相关资源
    最近更新 更多