2016-10-31 61 views
0

我在我的項目中有一些服務。 user.service.t.js 我想獲得某個站點的請求,例如sites.com並獲取網站的內容。我這樣做,寫下如下。請求一些網站與angular2

getSites(user) { 
    let body = JSON.stringify(user); 
    let headers = new Headers(); 
    headers.append('Content-Type', 'application/json'); 
    headers.append('Access-Control-Allow-Headers', 'Content-Type'); 
    headers.append('Access-Control-Allow-Origin', '*'); 
    headers.append('Access-Control-Allow-Credentials', "true"); 
    headers.append('Access-Control-Allow-Methods', 'GET, POST, OPTIONS'); 
    var requestoptions = new RequestOptions({ 
     method: RequestMethod.Get, 
     url: "http://www.joomag.com/", 
     headers: headers, 
     withCredentials: true 
    }) 

    return this.http.post("http://www.sites.com/", <RequestOptionsArgs> {withCredentials: true, headers: headers}) 
     .map((res: Response) => { 
     if (res) { 
      return { status: res.status, json: res.json() } 
     } 
     }); 

    } 

不過,我得到這個錯誤:

XMLHttpRequest cannot load http://www.sites.com/. Response for preflight is invalid (redirect) 
error_handler.js:45 EXCEPTION: Response with status: 0 for URL: null. 

我怎樣才能做到這一點。

回答

0

這些標頭在客戶端請求上沒有意義。他們需要在服務器響應中添加。如果它們沒有添加到服務器的響應中,則瀏覽器將引發此錯誤。

您可以JsonpModule代替HttpModule嘗試,但不能添加withCredentials選項有(不知道你是否真的需要它)。

+0

當我使用快遞服務器向遠程站點發送請求時,它工作正常。現在我想通過服務angular2來請求。當我使用jsonp時,它不適合我。 –

+0

這是CORS,它是一個瀏覽器功能,因此如果您從服務器發送請求,則不會遇到類似的情況。要麼你可以讓服務器發送所需的頭文件,要麼你可以使用JSONP,它有一些限制(沒有自定義頭文件),否則你運氣不好。另一種方法是向自己的服務器發出請求,並將請求從服務器轉發給您實際想要聯繫的服務器(因爲如上所述,CORS僅影響瀏覽器)。 –