import { HttpRequest } from '@angular/common/http'; import { InjectionToken, Injector, Injectable } from '@angular/core'; export const NA_HTTP_INTERCEPTOR_PREPARABLE = new InjectionToken('NA_HTTP_INTERCEPTOR_PREPARABLE'); /** * HTTP请求拦截器前置处理器 * * @export * @interface NaHttpInterceptorPreparable */ export interface NaHttpInterceptorPreparable { /** * 拦截器前置处理 * * @param {HttpRequest} req * @returns {HttpRequest} * @memberof NaHttpInterceptorPreparable */ prepare(req: HttpRequest, next: NaHttpRequestHandler): HttpRequest; } export abstract class NaHttpRequestHandler { abstract handle(req: HttpRequest): HttpRequest; } export class NaHttpInterceptorHandler implements NaHttpRequestHandler { constructor(private next: NaHttpRequestHandler, private preparable: NaHttpInterceptorPreparable) {} handle(req: HttpRequest): HttpRequest { return this.preparable.prepare(req, this.next); } } @Injectable() export class NaHttpInterceptorPreparableHandler implements NaHttpRequestHandler { private chain: NaHttpRequestHandler | null = null; constructor(private injector: Injector) {} handle(req: HttpRequest): HttpRequest { if (this.chain === null) { const preparables = this.injector.get(NA_HTTP_INTERCEPTOR_PREPARABLE, []); this.chain = preparables.reduceRight((next, interceptor) => new NaHttpInterceptorHandler(next, interceptor), new DefaultNaHttpRequestHandler()); } return this.chain.handle(req); } } export class DefaultNaHttpRequestHandler implements NaHttpRequestHandler { handle(req: HttpRequest): HttpRequest { return req; } }