Angular是一个流行的JavaScript框架,该框架为Web应用程序提供了一个良好的基础。Interceptors 是 Angular 提供的拦截器机制。这个机制允许你拦截 HTTP 请求和响应,做一些访问控制和业务逻辑的处理并将它们传递到下一个拦截器或请求中,提供了一种简单但强大的方式来创建一个可重用的 HTTP 拦截器。
拦截器的基本结构和用法
拦截器通过实现 HttpInterceptor
接口来创建。该接口定义了两个方法:
intercept(HttpRequest,next)
:拦截HTTP 请求并处理传递给它的响应。返回一个可观察的HTTP响应过程。HttpHandler
:实现了handle(HttpRequest)
方法,它处理HTTP请求并返回可观察的响应对象。
以下是一个例子,展示了如何实现一个拦截器:
import {Injectable} from '@angular/core';
import {HttpEvent, HttpHandler, HttpInterceptor, HttpRequest} from '@angular/common/http';
import {Observable} from 'rxjs';
@Injectable()
export class AuthInterceptor implements HttpInterceptor {
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const token = localStorage.getItem('access_token');
request = request.clone({
setHeaders: {
Authorization: `Bearer ${token}`
}
});
return next.handle(request);
}
}
在上面的例子中,AuthInterceptor
拦截器处理了请求,然后向请求头部添加了一个 Authorization
字段,来存放从本地存储中获取到的 access_token
的值。最后,处理被传递到下一个拦截器或请求中。
拦截器的使用示例
为了实现一个完整的拦截器示例,我们需要了解下面的两个场景:
- 每个发出的 HTTP 请求应该会先经过一个日志拦截器,然后才能被服务器处理。
- 服务端返回 HTTP 响应后,它应该跨域传递给客户端的每个响应都应该经过一个处理器。
下面三个示例分别展示了如何实现上述两个场景下的拦截器:
import { Injectable } from '@angular/core';
import { HttpInterceptor, HttpHandler, HttpRequest, HttpEvent } from '@angular/common/http';
import { Observable } from 'rxjs';
import { tap } from 'rxjs/operators';
@Injectable()
export class LoggingInterceptor implements HttpInterceptor {
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const started = Date.now();
return next.handle(req).pipe(
tap(event => {
const elapsed = Date.now() - started;
const message = `Request for ${req.urlWithParams} took ${elapsed} ms.`;
console.log(message);
})
);
}
}
在这个例子中,LoggingInterceptor
拦截器记录了每个请求的开始时间,并在每个请求结束时计算它所花费的时间。然后,将所记录的日志记入控制台。
另一个例子,展示了如何在 HTTP 响应后处理跨域请求:
import { Injectable } from '@angular/core';
import { HttpInterceptor, HttpHandler, HttpRequest, HttpResponse, HttpEvent } from '@angular/common/http';
import { Observable } from 'rxjs';
import { finalize, tap } from 'rxjs/operators';
@Injectable()
export class TimingInterceptor implements HttpInterceptor {
intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
const started = Date.now();
return next.handle(req).pipe(
tap(
event => {
if (event instanceof HttpResponse) {
const elapsed = Date.now() - started;
console.log(`Request for ${req.urlWithParams} took ${elapsed} ms.`);
}
},
error => console.error(error)
),
finalize(() => {
const elapsed = Date.now() - started;
console.log(`Request for ${req.urlWithParams} took ${elapsed} ms.`);
})
);
}
}
这个例子中,TimingInterceptor
拦截器在 HTTP 响应返回之前捕获了请求,并记录了请求的开始时间,然后在响应返回之后记录该请求所花费的时间。
以上是关于 Angular 中拦截器使用的攻略及示例说明,希望能够对您有所帮助。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Angular中的interceptors拦截器 - Python技术站