2017-06-14 109 views
0

我有一個Web應用程序,我想使用來自其他網頁的信息。一個典型的例子是從預測服務獲取XML格式的天氣信息。說「https://www.yr.no/place/United_States/New_York/New_York/varsel.xml」。當我嘗試通過XMLHttpRequest使用GET請求時,我得到了典型的跨源錯誤。當您不控制服務器時跨源資源共享?

簡單的解決方案是讓服務器允許CORS。但是如果我無法控制給定的服務器呢?有沒有其他的方式來請求數據?

我已經試過Chrome的Enable-CORS擴展,但這不是一個好的解決方案。此外,如果網站請求的數據需要驗證,則不起作用,如用戶名/密碼。

我似乎無法找到有關此問題的任何信息,但如果這是重複的,我很抱歉。

+3

您需要一個服務器端代理。 – SLaks

+0

感謝您的回覆。似乎是唯一的選擇。 – PederBG

+0

@PederBG你也可以嘗試npm的cors包。 https://www.npmjs.com/package/cors – Khurram

回答

2

對於只是想獲得一個公開可用資源的網絡就像https://www.yr.no/place/United_States/New_York/New_York/varsel.xml上的內容,並用它做的東西在你的前端JavaScript代碼,你不需要建立自己的代理,但可以的簡單情況只需使用現有的公開CORS代理,如https://cors-anywhere.herokuapp.com/

而不是給https://www.yr.no/place/United_States/New_York/New_York/varsel.xml到XHR /取通話(或jQuery.get()或Axios公司或任何電話),你給它這個網址:

https://cors-anywhere.herokuapp.com/https://www.yr.no/place/United_States/New_York/New_York/varsel.xml 

這會通過它增加了開放CORS代理https://cors-anywhere.herokuapp.com請求Access-Control-Allow-Origin響應標題,然後將它傳遞迴請求的前端代碼作爲響應。

響應頭是Access-Control-Allow-Origin響應頭是瀏覽器看到的,所以瀏覽器允許您的前端JavaScript代碼實際訪問響應。

但是,如果您要請求數據的網站需要身份驗證,那麼您不希望通過第三方代理(如https://cors-anywhere.herokuapp.com)發出請求 - 因爲那樣您就會將憑據公開給第三方第三方代理的所有者)。

但這種情況下,這是相當快速,輕鬆地,而不是從https://github.com/Rob--W/cors-anywhere或部分建立自己的私人代理使用的代碼,例如,或以其他方式設置一些簡單的代理機制在現有的後端代碼。

+0

謝謝,這有助於很多!但是,對於我提到的第二個案例,它會起作用嗎?如果資源受密碼保護,您需要如下所示:'xmlHttp.open('GET',url,true,username,password); xmlHttp.withCredentials = true;' – PederBG

+1

儘管可以使它適用於需要憑證的請求的情況,但在此情況下,您不希望使用公共代理,因爲那樣您會將憑證第三方(公衆代理人的所有人)。但是對於這種情況,使用https://github.com/Rob--W/cors-anywhere/中的代碼或者其他一些代碼來設置您自己的私有代理相當快速且容易 - 或者設置一些簡單的代碼代理機制在您現有的後端代碼中。我會更新答案注意這一點。 – sideshowbarker