2017-09-01 68 views
0

我想獲取一個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來確定請求的真實狀態碼?

+1

不能使用['Response.status'(https://developer.mozilla.org/en-US/docs/Web/API/Response/status)? – Li357

+1

我不認爲這是可能的 –

+0

@andrewLi Response.status告訴最終目的地的狀態,而不是所請求的URL的狀態 –

回答

2

可以先回答你的問題,不,你不能確定301和302之間的區別,而不在後端的一些變化。(關注這個SO dicussion的後端解決方案)。

你可以做的另一件事是設置重定向到'錯誤',在這種情況下,抓取會在所有重定向上拋出錯誤,並且你可以處理如果它是重定向時發生的情況。

這是這樣的主要原因是(從我的理解)是因爲301和302之間的差異主要是有用的瀏覽器需要處理後續請求應該如何表現(是否永久更改緩存或只是這個請求)。

但是就用戶而言,spec規定了兩種情況都要透明處理,這意味着您需要知道存在重定向,但導致重定向的狀態代碼並不重要。因此只有response.redirected標誌。但是如果您仍然需要請遵循上述後端解決方案。

1

至於爲什麼代碼不能檢查Response.status:在重定向的情況下,這將是任何響應的狀態代碼,最終由於任何重定向而返回。

因此,如果重定向最終將某個地方返回200,那麼Response.status將僅爲200.沒有中間狀態代碼暴露於在瀏覽器中運行的前端JavaScript--正如the previous (very good) answer posted here已經指出的那樣。

這確實給了我很多的信息,尤其是它通過告訴我:

response.redirected 

值得一提的是,僅僅能夠檢測是否有過一個重定向,你居然不要」甚至不需要檢查。這是檢查最簡單的方法,但您也可以檢查Response.url,如果這與您給fetch(…)調用的請求URL不同,則知道它已被重定向。

以前是典型的檢查方式Response.redirectedwas first introduced

另外值得注意的是:redirect: 'true'在代碼中的問題是無效的;它會導致代碼過早失敗。見https://developer.mozilla.org/en-US/docs/Web/API/Request/redirect

RequestRedirect枚舉值,其可以是一個以下字符串:

  • follow
  • error
  • manual

那麼問題中的代碼似乎打算是redirect: 'follow'。但是follow實際上是redirect默認的,所以你不需要特別指明,而是可以只是忽略它。

至於其他redirect值:如an answer to another question here at Stack Overflow所述,除了某些Service Worker情況外,幾乎肯定不會指定manual。而error意味着將任何重定向視爲網絡錯誤。

在這種情況下,對於示例中的代碼,redirect: 'true'會導致catch受到影響,您必須訪問任何響應的詳細信息,包括是否重定向。

所以要循環回你原來的問題:

我想獲取一個URL,並確定有什麼樣的狀態代碼,特別是如果它有一個HTTP 301或HTTP 302狀態碼

...答案是,對於重定向的請求,在瀏覽器中運行的前端JavaScript代碼實際上沒有辦法檢測任何重定向的確切狀態代碼。

所以如果你真的需要知道的是可能發生的給定的URL的請求重定向任何確切的狀態代碼,您必須從後端代碼的請求,並處理響應那裏。