如何确定获取请求的状态代码?

时间:2017-09-01 16:03:07

标签: javascript google-chrome fetch fetch-api

我想获取一个URL并确定它具有哪些状态代码,特别是如果它具有HTTP 301或HTTP 302状态代码:

fetch('https://httpstat.us/301', {
    redirect: 'true'})
    .then(response => {
       console.log(response);
       const headers = response.headers.entries();
       for (h of headers) {
        console.log(h);
        }
    }).catch(err => {
        console.log("in error case")
        console.log(err);
    })

这确实给了我很多信息,特别是它通过以下方式告诉我:

response.redirected 

这是真的。但这只能告诉我重定向,而不是状态代码。

有没有办法使用Fetch API来确定请求的真实状态代码?

2 个答案:

答案 0 :(得分:2)

好的,首先回答你的问题,如果后端没有一些变化,你就无法确定301和302之间的区别。(关注后端解决方案SO dicussion。)

你可以做的另一件事是将重定向设置为'error',在这种情况下,fetch会在所有重定向上引发错误,你可以处理如果它是重定向会发生什么。

这就是(根据我的理解)的主要原因是因为301和302之间的区别对于需要处理后续请求应该如何表现的浏览器(无论是永久更改缓存还是只是此请求)主要有用)。

但就用户而言,规范指定两种情况都要透明地处理,这意味着您需要知道存在重定向但是导致重定向的状态代码无关紧要。因此只有response.redirected标志。但是,如果您仍需要请遵循上述后端解决方案。

答案 1 :(得分:1)

至于为什么代码不能只检查response.status:在重定向的情况下,这将是任何重定向最终返回的响应的状态代码。

因此,如果重定向最终在某处返回200,那么响应 .status将只有200.没有中间状态代码暴露给在浏览器中运行的前端JavaScript - {{3已经指出了。

  

这确实给了我很多信息,特别是它通过以下方式告诉我:

response.redirected

值得注意的是,为了能够检测是否存在重定向,您实际上甚至不需要检查它。这是最简单的检查方式,但您也可以只检查the previous (very good) answer posted here,如果这与您拨打fetch(…)电话的请求网址不同,则表示您已将其重定向。

以前是响应之前检查的典型方法 .redirected response.url

另外值得注意的是:问题代码中的redirect: 'true'无效;它会导致代码过早失败。见was first introduced

  

一个RequestRedirect枚举值,可以是以下字符串之一:

     
      
  • follow
  •   
  • error
  •   
  • manual
  •   

那么问题中的代码似乎意图是redirect: 'follow'。但follow实际上是redirect的默认值,因此您无需明确指定它,只需省略它即可。

至于其他redirect值:正如https://developer.mozilla.org/en-US/docs/Web/API/Request/redirect中所述,除了一些服务工作者案例之外,您几乎肯定不会指定manualerror表示将任何重定向视为网络错误。

在这种情况下,对于示例中的代码,redirect: 'true'会导致catch被攻击,您必须访问响应的任何详细信息,包括是否有重定向。

所以回到原来的问题:

  

我想获取一个URL并确定它具有哪些状态代码,特别是如果它具有HTTP 301或HTTP 302状态代码

...答案是,对于重定向的请求,在浏览器中运行的前端JavaScript代码无法检测任何重定向的确切状态代码。

因此,如果您确实需要知道对给定URL的请求可能发生的任何重定向的确切状态代码,您必须从后端代码发出请求,并在那里处理响应。