import { Injectable } from '@angular/core'; import { HttpEvent, HttpInterceptor, HttpHandler, HttpRequest, HttpResponse, HttpClient } from '@angular/common/http'; import { Observable, of, throwError, timer } from 'rxjs'; import { mergeMap } from 'rxjs/operators'; const interceptedUrls = [ {regex: /\/loans$/, method: 'GET', filename: 'summary.json', returnStatusCode: 200}, {regex: /\/loans\/\d+$/, method: 'GET', filename: 'detail.json', returnStatusCode: 200} ] const jsonResponsesBasePath: string = 'assets/fake-backend-responses/' @Injectable() export class FakeBackendInterceptor implements HttpInterceptor { constructor(private http: HttpClient) {} intercept(request: HttpRequest, next: HttpHandler): Observable> { for (const element of interceptedUrls) { if(request.url.match(element.regex) && request.method === element.method) { return this.http.get( jsonResponsesBasePath + element.filename).pipe( mergeMap((data) => { return buildHttpResponse(data, element.returnStatusCode); }) ); } } return next.handle(request); function buildHttpResponse(body?, status=200, delay=500): Observable> { if (status >= 200 && status < 300) { return timer(delay).pipe( mergeMap(() => of(new HttpResponse({ status, body }))) ); } else { timer(delay).pipe( mergeMap(() => throwError(new HttpResponse({ status, body }))) ); } } } }