2016-06-15 69 views
2

我無法通過使用http發出CORS請求(這是使用Ionic版本2)將我的Angular 1 JavaScript服務移動到Angular 2 TypeScript服務。在Angular 1中,我做了這樣的事情。如何在離子中使用CORS編寫Angular 2服務?

angular.module('app.services',[]) 
.factory('LoginService', ['$http', function($http) { 
var service = {}; 

service.isUserLoggedIn = function() { 
    var restUrl = 'http://10.10.10.25:8080/api/user/isloggedin'; 
    var options = { 
    method: 'GET', url: restUrl, withCredentials: true, 
    headers: { 
    'x-request-with': 'XMLHttpRequest', 
    'x-access-token': 'sometoken' 
    } 
    }; 
    return $http(options); 
}; 

return service; 
}]) 

在使用TypeScript的Angular 2中,很多已經改變(Promises/Observables)。到目前爲止,我的嘗試如下所示。

import { Injectable } from '@angular/core'; 
import { Headers, Http, Response, RequestMethod, RequestOptionsArgs } from '@angular/http'; 
import { Observable } from 'rxjs/Observable'; 

@Injectable() 
export class LoginService { 
    constructor(private _http:Http) { 

    } 

    isLoggedIn():boolean { 
    var r:any; 
    var e:any; 
    let url = 'http://10.10.10.25:8080/api/user/isloggedin'; 
    let options:RequestOptionsArgs = { 
     url: url, 
     method: RequestMethod.Get, 
     search: null, 
     headers: new Headers({ 
     'Content-Type': 'application/json', 
     'X-Requested-With': 'XMLHttpRequest', 
     'x-access-token' : 'sometoken' 
     }), 
     body: null 
    }; 
    this._http.get(url, options).map(this.extractData).catch(this.handleError) 
     .subscribe(
     response => { r = <any>response; console.log(r); }, 
     error => { e = <any>error; console.log(e); }); 
    return false; 
    } 

    private extractData(response:Response) { 
    let body = response.json(); 
    return body.data || { }; 
    } 

    private handleError(error:any) { 
    let errMsg = (error.message) ? error.message : 
     error.status ? `${error.status} - ${error.statusText}` : 'Server error'; 
    console.log('error = ' + errMsg); 
    return Observable.throw(errMsg); 
    } 
} 

我不再知道如何在角2地址是什麼,我在角1

我做了一點點的搜索,我能夠理解如何插入頁眉和正確處理訂閱。但是,withCredentials仍然是一個問題。

我發現這個SO帖子angular2 xhrfields withcredentials true並修改了我的構造函數,如下所示。它現在有效。

constructor(@Inject(Http) private _http:Http) { 
    let _build = (<any> _http)._backend._browserXHR.build; 
    (<any> _http)._backend._browserXHR.build =() => { 
     let _xhr = _build(); 
     _xhr.withCredentails = true; 
     return _xhr; 
    } 
    } 

回答

1

withCredentails的支持將出現在即將發佈的RC2版Angular2中。它不是RC1版本的一部分......你需要等一下。

隨着RC2,您將能夠直接在請求選項使用此屬性:

this.get('...', { withCredentials: true }) 

詳情請參見這個問題: