2016-06-15 4 views
2

У меня возникли проблемы с переносом службы JavaScript с угловым 1 в службу Anglo 2 TypeScript с использованием http для запроса CORS (это использует Ionic version 2). В Angular 1 я делаю что-то вроде этого.Как написать услугу «Угловая 2» с помощью CORS in Ionic?

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; 
}]) 

В Angular 2, используя TypeScript, многое изменилось (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 (обратите внимание, что https://angular.io/docs/js/latest/api/http/index/RequestOptionsArgs-interface.html#!#withCredentials-anchor говорит RequestOptionsArgs должен иметь поле withCredentials, но я получаю сообщение об ошибке в IDE Visual Studio Code говорит, что он не существует в интерфейсе; возможно, ионный использует более старую версию с угловым 2?)
  • заголовки (x-request-with и x-access-token)
  • фактический ответ

я сделал немного больше поиска, и я был в состоянии понять, как вставить заголовки и правильно обрабатывать подписки. Тем не менее, withCredentials по-прежнему является проблемой.

Я нашел это сообщение 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 }) 

Смотрите этот вопрос для более подробной информации:

Смежные вопросы