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

Javascript 如何确定提取请求的状态代码?,javascript,google-chrome,fetch,fetch-api,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) {

我想获取一个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 
response.redirected
这是真的。但这只是告诉我它重定向了,而不是状态码是什么


有没有一种方法可以使用fetchapi来确定请求的真实状态代码

确定首先回答您的问题否如果后端没有一些更改,您无法确定301和302之间的差异。(请按照此说明了解后端解决方案)

您可以做的另一件事是将redirect设置为“error”,在这种情况下,fetch将在所有重定向上抛出一个错误,您可以处理重定向时发生的情况

这样做的主要原因是(根据我的理解),因为301和302之间的差异主要对需要处理后续请求的行为(是永久更改缓存还是仅此请求)的浏览器有用


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

至于代码不能检查的原因:在重定向的情况下,这将是任何重定向最终返回的响应的状态代码

所以,如果重定向最终将返回200的内容带到某个地方,那么response.status将仅为200。如前所述,没有中间状态代码暴露于浏览器中运行的前端JavaScript

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

response.redirected 
response.redirected
值得注意的是,为了能够检测是否有重定向,实际上您甚至不需要检查它。这是最简单的检查方法,但您也可以直接检查,如果这与您为
fetch(…)
调用提供的请求URL不同,您就知道它被重定向了

这曾经是响应前检查的典型方式。重定向

另外值得注意的是:
问题代码中的重定向:“true”
无效;这将导致代码过早失败。见:

ValueA
RequestRedirect
enum值,可以是以下字符串之一:

  • 遵循
  • 错误
  • 手册
因此,问题中的代码似乎想要的是
重定向:“follow”
。但是
follow
实际上是
重定向
的默认值,因此您不需要显式指定它,只需省略它即可

至于其他
重定向
值:如中所述,除了一些服务人员案例外,您几乎肯定不想指定
手动
。而
error
意味着将任何重定向视为网络错误

在这种情况下,对于示例中的代码,
redirect:'true'
将导致
catch
被命中,并且您必须访问响应的任何细节,包括它是否被重定向

所以,回到你原来的问题:

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

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


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

您不能使用吗?我认为这是不正确的possible@andrewLiResponse.status表示最终目的地的状态,而不是请求的URL的状态