2016-12-07 4 views
2

Я создаю webapp используя Angular2.Angular2: Подписаться на все HTTP-запросы

Возможно ли выполнение функции каждый раз, когда Angular2 делает HTTP-запрос?

Это будет использоваться для проверки необходимости обновления токена JWT.

Спасибо!

ответ

4

Вы можете использовать собственный Http класс, который обеспечивает наблюдаемую, что компоненты или другие услуги могут подписаться и генерирует событие каждый раз, когда запрос сделан

@Injectable() 
class NotifyingHttp extends Http { 
    requestSent:Subject = new Subject(); 
    requestCompleted:Subject = new Subject(); 
    constructor(_backend: ConnectionBackend, _defaultOptions: RequestOptions) { 
    super(_backend, _defaultOptions); 
    } 

    get(url: string, options?: RequestOptionsArgs) : Observable<Response> { 
    this.requestSent.next(url); 
    return super.get(newUrl, options) 
    .finally(response => this.requestCompleted.next(url)); 
    } 

    post(...) 
    ... 
} 

нуждается Каждый метод должен быть переопределен в этом способ (получить, пост ...)

Вы можете создать общий модуль, который затем активируется путем добавления его импорта AppModule:

@NgModule({ 
    imports: [HttpModule], 
    export: [HttpModule], 
    providers: [ 
    {provide: ConnectionBackend: useClass XhrBackend}, 
    {provide: Http, useClass: NotifyingHttp}] 
}) 
export class NotifyingHttpModule {} 
@NgModule({ 
    imports: [BrowserModule, NotifyingHttpModule], 
    declarations: [AppModule], 
    bootstrap: [AppModule] 
}) 
export class AppModule {} 

Смотрите также Angular2 : The responses to HTTP get requests are being cached in IE

+0

Вы должны использовать фабрику. Расширение Http Все еще вызывает конструктор Http, который вызывается угловым, вместо конструктора пользовательского класса ([связанного с этим] (http://stackoverflow.com/a/40295956/2587435)). Поэтому вам нужно использовать завод и создать его самостоятельно. И так как ConnectionBackend - это интерфейс (не поставщик для этого токена), вам нужно использовать XHRBackend для фабрики. –

+0

Это может объяснить, почему я должен был добавить провайдера '{предоставить: ConnectionBackend: useClass XhrBackend}', но это должно быть сделано (согласно тесту в плункере, который я недавно сделал) –

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