I am trying to implement HttpCache through interceptor. Following is the caching-interceptor.service.ts
import { HttpRequest, HttpResponse, HttpInterceptor, HttpHandler, HttpEvent } from '@angular/common/http' import { Injectable } from '@angular/core'; import { Observable } from 'rxjs/Observable'; import 'rxjs/add/operator/do'; import 'rxjs/add/observable/of'; export abstract class HttpCache { abstract get(req: HttpRequest<any>): HttpResponse<any>|null; abstract put(req: HttpRequest<any>, resp: HttpResponse<any>): void; } @Injectable() export class CachingInterceptor implements HttpInterceptor { constructor(private cache: HttpCache) {} intercept(req: HttpRequest<any>, next: HttpHandler) : Observable<HttpEvent<any>> { if(req.method !== 'GET'){ return next.handle(req); } const cachedResponse = this.cache.get(req); if(cachedResponse){ return Observable.of(cachedResponse); } return next.handle(req).do(event => { if(event instanceof HttpResponse){ this.cache.put(req, event); } }) } }
and I am calling from test.service.ts
import { Injectable } from '@angular/core'; import { Headers, Http, Response} from '@angular/http'; import { HttpClient} from '@angular/common/http'; import { Observable } from 'rxjs/Observable'; import { ReplaySubject } from 'rxjs/ReplaySubject'; import 'rxjs/add/operator/map'; import 'rxjs/add/operator/catch'; import { BehaviorSubject } from 'rxjs/BehaviorSubject'; import { APIService } from './api.service'; import { CachingInterceptor } from './caching-interceptor.service'; import { ConfigurationService } from './configuration.service'; import { AuthenticationStatus, IAuthenticationStatus } from '../models'; import { User } from '../models/user.model'; @Injectable() export class PlatformService extends APIService { constructor(private http: Http, public httpClient: HttpClient, private configuration: ConfigurationService, public cachingInterceptor: CachingInterceptor) { super(); } getUserById(id: string) { console.log(this.requestOptions); return this.httpClient.get(this._getAPIUrl('user/' + id),this.requestOptions). subscribe(res => res); } get requestOptions(): RequestOptions { const tokenObj = window.localStorage.getItem('TOKEN'); const token = JSON.parse(tokenObj); const headers = this.headers; headers.append('Authorization', 'Bearer ' + token.token); headers.append('Access-Control-Allow-Origin', '*'); return new RequestOptions({ headers: headers }); } }
and Module file is following
import { CommonModule } from '@angular/common'; import { HTTP_INTERCEPTORS, HttpClient } from '@angular/common/http'; import { FormsModule } from '@angular/forms'; import { ModuleWithProviders, NgModule } from '@angular/core'; import { PlatformService } from '../../services/platform.service'; import { CachingInterceptor } from '../../services/caching-interceptor.service'; @NgModule({ imports: [CommonModule, FormsModule], declarations: [], exports: [], entryComponents: [EntryHereComponent] }) export class StructurModule { public static forRoot(): ModuleWithProviders { return { ngModule: StructurModule, providers: [PlatformService, { provide: HTTP_INTERCEPTORS, useExisting: CachingInterceptor, multi: true },HttpClient] }; } }
I don't understand, what are missing so it giving error
No provider for HttpHandler.
If I add HttpHandler in provider in module file, It start giving error for provide: HTTP_INTERCEPTORS, component.
Resolution. The issue is more due to not registering the required services i.e HttpClientModule in the root module ie. NgModule. As per Angular Design and Architecture every service (internal or external service) is required to be registered with root NgModule as required.
Descriptionlink. HttpHandler is injectable. When injected, the handler instance dispatches requests to the first interceptor in the chain, which dispatches to the second, etc, eventually reaching the HttpBackend . In an HttpInterceptor , the HttpHandler parameter is the next interceptor in the chain.
HttpClient
is introduced in angular 4.3,so if you want to use HttpClient
you need to import HttpClientModule
from '@angular/common/http'
. Make sure to import HttpClientModule
after BrowserModule
as shown below. This official doc and so answer will give you indepth information.
import { HttpClientModule } from '@angular/common/http'; @NgModule({ imports: [ BrowserModule, HttpClientModule ], ...
Add HttpClientModule to your imports[] in app.module.ts. This might be one of the mistakes.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With