【拦截器】Angular10轻松实现请求头传参数,针对性不同情况下,拦截器HttpInterceptor的创建和使用

简介: 【拦截器】Angular10轻松实现请求头传参数,针对性不同情况下,拦截器HttpInterceptor的创建和使用

interceptor/req.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';
@Injectable()
export class ReqInterceptor implements HttpInterceptor {
    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        //请求拦截
        console.log('【请求拦截】', req);
        console.log('【请求拦截获取到的参数】', req.headers.get('param'));
        return next.handle(req).pipe(
            tap(
                //响应拦截
                res => {
                    console.log('【响应拦截】', res);
                    if (res instanceof HttpResponse) {
                        if (res.status >= 500) {
                            // 跳转错误页面
                        }
                    }
                },
                // token过期 服务器错误等处理
                err => {
                    console.log('【服务器错误】', err);
                })
        );
    }
}

app.module.ts

import { ReqInterceptor } from './interceptor/req.interceptor';
...
  imports: [
    ...
    HttpClientModule,//这个很重紧要,没有就会报错
  ],
  providers: [
    {
      provide: HTTP_INTERCEPTORS,
      useClass: ReqInterceptor, //自定义拦截器的类名
      multi: true //这是必须的,因为它会告诉 Angular 这个 HTTP_INTERCEPTORS 表示的是一个数组,而不是单个的值。
    }
  ],
...

services/http.service.ts

import { HttpClient } from '@angular/common/http';
import { Injectable } from '@angular/core';
@Injectable({
  providedIn: 'root'
})
export class HttpService {
  private apiUrl = "http://localhost:8888/test/1.json";
  constructor(private http: HttpClient) { }
  public getData(params: any) {
    return this.http.get(this.apiUrl, {
      params,
      headers: { 'param': 'get传给拦截器的参数' }
    });
  }
  public postData(params: any) {
    return this.http.post(this.apiUrl,
      { params },
      {
        headers: { 'param': 'post传给拦截器的参数' }
      });
  }
}

app.component.ts

import { HttpService } from './services/http.service';
...
  constructor(
    public http: HttpService
  ) { }
...
  ngOnInit() {
    this.http.getData({ param1: 1, param2: 2 }).subscribe(d => {
      console.log(d);
    });
    this.http.postData({ param1: 1, param2: 2 }).subscribe(d => {
      console.log(d);
    });
  }

运行起来后网页中F12打开查看

这样我们就可以根据不同的接口来源,执行针对性的拦截措施


相关文章
|
3月前
如何在 Angular 路由中使用查询参数
如何在 Angular 路由中使用查询参数
27 0
|
6月前
【超实用】Angular如何修改当前页面网页浏览器url后面?param1=xxx&param2=xxx参数(多用于通过浏览器地址参数保存用户当前操作状态的需求),实现监听url路由切换、状态变化。
【超实用】Angular如何修改当前页面网页浏览器url后面?param1=xxx&param2=xxx参数(多用于通过浏览器地址参数保存用户当前操作状态的需求),实现监听url路由切换、状态变化。
【超实用】Angular如何修改当前页面网页浏览器url后面?param1=xxx&param2=xxx参数(多用于通过浏览器地址参数保存用户当前操作状态的需求),实现监听url路由切换、状态变化。
|
6月前
几个经常用到的angular路由Router、ActivatedRoute 知识点:嵌套路由、路由跳转、路由传参、路由参数获取
几个经常用到的angular路由Router、ActivatedRoute 知识点:嵌套路由、路由跳转、路由传参、路由参数获取
几个经常用到的angular路由Router、ActivatedRoute 知识点:嵌套路由、路由跳转、路由传参、路由参数获取
|
6月前
【超实用】Angular如何修改当前页面网页浏览器url后面?param1=xxx&param2=xxx参数(多用于通过浏览器地址参数保存用户当前操作状态的需求),实现监听url路由切换、状态变化。
【超实用】Angular如何修改当前页面网页浏览器url后面?param1=xxx&param2=xxx参数(多用于通过浏览器地址参数保存用户当前操作状态的需求),实现监听url路由切换、状态变化。
|
JavaScript
Angular1.x的自定义指令directive参数配置详细说明
Angular1.x的自定义指令directive参数配置详细说明
从 Angular 中的 URL 获取查询参数
本文介绍了如何从 Angular 中的 URL 获取查询参数。 通过注入ActivatedRoute的实例,可以订阅各种可观察对象,包括queryParams和params observable。以下是范例: import { ActivatedRoute } from '@angular/rou...
1581 0
|
移动开发 JavaScript 网络架构
Angular最新教程-第九节 路由二(路由策略、base标签、路由参数)
Angular最新教程-第九节 路由二(路由策略、base标签、路由参数)
333 0
Angular最新教程-第九节 路由二(路由策略、base标签、路由参数)
|
JavaScript Java
Angular1.5.8路由参数的使用
在Angular 1.5.8中,经常会涉及到页面的跳转,很多页面的跳转都需要带参数,在JSP项目中,可以使用 window.location.href = 'http://hostname:port?param_1=xxx&param_2=xxx#/...
1834 0
|
JSON 数据格式
Angular中通过$location获取地址栏的参数详解
Angular中通过$location获取url中的参数   最近,项目开发正在进行时,心有点燥,许多东西没来得及去研究,今天正想问题呢,同事问到如何获取url中的参数,我一时半会还真没想起来,刚刚特意研究了一下,常用的方法就以下几种: 1.
1677 0