import { HttpErrorResponse, HttpEvent, HttpHandler, HttpInterceptor, HttpRequest, HttpResponseBase } from '@angular/common/http'; import { Injectable } from '@angular/core'; import { Observable, of } from 'rxjs'; import { catchError, mergeMap } from 'rxjs/operators'; import { CoreService } from './../core.service'; const CODEMESSAGE: { [key: number]: string } = { 200: '服务器成功返回请求的数据。', 201: '新建或修改数据成功。', 202: '一个请求已经进入后台排队(异步任务)。', 204: '删除数据成功。', 400: '发出的请求有错误,服务器没有进行新建或修改数据的操作。', 401: '用户没有权限(令牌、用户名、密码错误)。', 403: '用户得到授权,但是访问是被禁止的。', 404: '发出的请求针对的是不存在的记录,服务器没有进行操作。', 406: '请求的格式不可得。', 410: '请求的资源被永久删除,且不会再得到的。', 422: '当创建一个对象时,发生一个验证错误。', 500: '服务器发生错误,请检查服务器。', 502: '网关错误。', 503: '服务不可用,服务器暂时过载或维护。', 504: '网关超时。' }; @Injectable() export class DefaultInterceptor implements HttpInterceptor { constructor(private coreSrv: CoreService) {} intercept(req: HttpRequest, next: HttpHandler): Observable> { return next.handle(req).pipe( mergeMap(ev => this.handlingHttpResponseData(ev)), catchError((err: HttpErrorResponse) => this.handlingHttpErrorResponse(err)) ); } /** * 处理Http响应数据 */ private handlingHttpResponseData(ev: HttpEvent): Observable { if (ev instanceof HttpResponseBase) { // 正常情况直接返回到下个业务拦截器处理 if (ev.status >= 200 && ev.status < 300) { return of(ev); } // 所有状态不是2xx和3xx都当作异常处理 if (ev instanceof HttpErrorResponse) { return this.handlingHttpErrorResponse(ev); } } return of(ev); } /** * 处理默认Http响应错误 */ private handlingHttpErrorResponse(err: HttpErrorResponse): Observable { return of(err); } }