import { Injectable } from '@angular/core'; import { HttpRequest, HttpHandler, HttpEvent, HttpInterceptor, HttpHeaders, HttpResponse } from '@angular/common/http'; import { Observable, of } from 'rxjs'; import { tap } from 'rxjs/operators'; import { RequestCacheService } from '../services/request-cache.service' @Injectable() export class CachingInterceptor implements HttpInterceptor { constructor(private cache: RequestCacheService) { } intercept(req: HttpRequest, next: HttpHandler) { // continue if not cachable. if (!isCachable(req)) { return next.handle(req); } const cachedResponse = this.cache.get(req); return cachedResponse ? of(cachedResponse) : sendRequest(req, next, this.cache); } } /** Is this request cachable? */ function isCachable(req: HttpRequest) { // Only GET requests are cachable return req.method === 'GET'; /* return req.method === 'GET' && -1 < req.url.indexOf("url"); */ } /** * Get server response observable by sending request to `next()`. * Will add the response to the cache on the way out. */ function sendRequest( req: HttpRequest, next: HttpHandler, cache: RequestCacheService): Observable> { // No headers allowed in npm search request const noHeaderReq = req.clone({ headers: new HttpHeaders() }); return next.handle(noHeaderReq).pipe( tap(event => { // There may be other events besides the response. if (event instanceof HttpResponse) { // cache.put(req, event); // Update the cache. } }) ); }