zoukankan      html  css  js  c++  java
  • Angular8 Http拦截器简单使用

    拦截器

    Http拦截器就是拦截发出的请求,对其进行统一添加额外处理,然后放行;对响应进行拦截并作出业务上的判断,决定是否给与返回。
    先看一组常见的业务请求:

    this.http.post('http://127.0.0.1:8080/api/getList', {
          header: {
            token: 'asdasdas'
          },
          observe: 'body',
          params: {
            pageSize: 10,
            pageIndex: 1
          },
          responseType: 'json',
          withCredentials: true
        });

    可以看出有些配置是几乎所有请求都共通得,有的需要token等参数,一个项目全部手动写得话,第一容易漏写,第二以后如果有改动,需要所有接口都调整,不利于维护,最理想得状态就是只修改参数和api地址,其他得交给特别得机制去处理,这就引出了今天的主角-HttpInterceptor

    广州品牌设计公司https://www.houdianzi.com PPT模板下载大全https://redbox.wode007.com

    定义拦截器

    按照官方约定,文件应该是以‘.interceptor.ts’作为后缀

    import { Injectable } from '@angular/core';
    import { HttpInterceptor, HttpEvent, HttpHandler, HttpRequest, HttpResponse } from '@angular/common/http';
    import { Observable } from 'rxjs';
    import { tap } from 'rxjs/operators';
    const ignoreToken = ['login', 'logout', 'table'];
    @Injectable()
    export class CommonInterceptor implements HttpInterceptor {
      intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        // 先补全请求协议
        let url = req.url;
        const needToken = ignoreToken.filter(u => url.match(u));
        if (url.indexOf('http://') < 0 || url.indexOf('https://') < 0) {
          url = 'http://' + url;
        }
        // 过滤掉不需要token的请求
        if (!needToken.length) {
          req = req.clone({
            url
          });
        } else {
          req = req.clone({
            url,
            headers: req.headers.set('token', 'asdqwe')
          });
        }
        return next.handle(req).pipe(
          tap(
            event => {
              if (event instanceof HttpResponse) {
                console.log(event);
                if (event.status >= 500) {
                  // 跳转错误页面
                }
              }
            },
            error => {
              // token过期 服务器错误等处理
            })
        );
      }
    }

    组件:

    getTemp() {
        this.http.post('172.16.10.161:3000/table', {
          params: {
            pageSize: 10,
            pageIndex: 1
          }
        }).subscribe(res => {
          console.log(res);
        });
      }

    该拦截器实现的功能比较简单,但是结构算是完整的,和管道类似,想应用此拦截器需要注入在app模块,
    在providers数组种添加

    provide: HTTP_INTERCEPTORS, useClass: CommonInterceptor, multi: true }

    拦截器根据业务复杂度,其内容也随着复杂,通常管理下共通的配置,核心是处理各类异常,甚至错误码处理。

  • 相关阅读:
    ios9 之后 配置百度地图出现的错误
    While reading XXX pngcrush caught libpng error: N
    主题:Java WebService 简单实例
    win7下如何建立ftp服务器
    64.Minimum Path Sum
    63.Unique Path II
    62.Unique Paths
    32.Longest Valid Parenttheses
    105.Construct Binary Tree from Preorder and Inorder Traversal
    83.Remove Duplicates from Sorted List
  • 原文地址:https://www.cnblogs.com/qianxiaox/p/14102233.html
Copyright © 2011-2022 走看看