2016-10-21 85 views
5

我想使用抓取API從URL獲取整個HMTL文檔。爲什麼提取返回狀態= 0的響應?

let config = { 
method: 'GET', 
headers: { 
    'Content-Type': 'application/json', 
    'Accept': 'text/html', 
    'Accept-Language': 'zh-CN', 
    'Cache-Control': 'no-cache' 
}, 
mode: 'no-cors'}; 

fetch('http://www.baidu.com', config).then((res)=> { 
console.log(res);}).then((text)=> {}); 

在chrome中運行代碼,它觸發一個請求並在chrome網絡中返回html。但獲取資源收益:

enter image description here

爲什麼狀態,我怎樣才能得到正確的資源像什麼的鍍鉻代理店?

+0

狀態0是依賴於庫的,函數庫是'fetch'函數? – tcooc

+0

'fetch'是一個本地函數(現在)。 – Brian

回答

5

config.modeno-cors部分:

無CORS - 從被任何比HEAD其他防止方法,GET或POST。如果任何ServiceWorkers攔截這些請求,它們可能不會添加或覆蓋除這些之外的任何標題。另外,JavaScript可能無法訪問生成的響應的任何屬性。這可確保ServiceWorkers不會影響Web的語義,並防止跨域泄漏數據導致安全和隱私問題。

實際上,響應你提出這種請求(指定爲模式no-cors)得到的將不包含有關請求是成功還是失敗的信息,從您的通話fetch使拆卸mode狀態碼0將表明CORS事實上已經失敗。

要了解您的具體情況下的含義,請參閱其他SO答案。

+0

Thx,如果我刪除'no-cors': – pingfengafei

+1

Thx,如果我刪除'no-cors':對預檢請求的響應沒有通過訪問控制檢查:沒有'Access-Control-Allow-Origin'標頭存在請求的資源。原因'http:// localhost:8888'因此不被允許訪問。如果一個不透明的響應滿足您的需求,請將請求的模式設置爲'no-cors'來取消禁用CORS的資源。如何解決CORS? – pingfengafei

+0

這是正確的。 CORS是瀏覽器安全功能,不能從頁面本身禁用。如果你想從你的瀏覽器請求他們的頁面,你必須聯繫baidu.com。 – Brian

0

我不知道如何在瀏覽器環境下做到這一點,但我知道它可用於fetch某些來自Node中的跨源網站。

require('es6-promise').polyfill(); 
require('isomorphic-fetch'); 
fetch('https://www.baidu.com', { 
    mode: 'no-cors' 
}) 
    .then((res) => { 
    console.log(res.status); //=> 200 
    }); 

所以,你可以使用節點服務器fetch你想要什麼,然後respond到客戶端。

我也想fetch東西從瀏覽器中的一些網站,這似乎是不可能的。也許這是確實不可能做到這一點,因爲互聯網需要保護我們想從中獲取資源的那些網站。