在Angular 8中,HttpInterceptor的返回值可以是Observable或Promise。你可以在拦截器中修改请求或响应,并返回修改后的请求或响应。
下面是一个示例,展示如何在HttpInterceptor中修改请求的URL:
import { Injectable } from '@angular/core';
import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent } from '@angular/common/http';
import { Observable } from 'rxjs';
@Injectable()
export class MyInterceptor implements HttpInterceptor {
intercept(req: HttpRequest, next: HttpHandler): Observable> {
// 修改请求的URL
const modifiedReq = req.clone({ url: 'https://api.example.com' + req.url });
// 继续发送修改后的请求
return next.handle(modifiedReq);
}
}
在上面的示例中,intercept
方法接收一个HttpRequest对象和一个HttpHandler对象作为参数。你可以通过修改HttpRequest对象来改变请求的属性,如URL、headers等。然后,你可以调用HttpHandler的handle
方法继续发送修改后的请求。
如果你想在拦截器中修改响应,可以使用pipe
操作符来处理Observable的数据流。下面是一个示例,展示如何在HttpInterceptor中修改响应的数据:
import { Injectable } from '@angular/core';
import { HttpInterceptor, HttpRequest, HttpHandler, HttpEvent } from '@angular/common/http';
import { Observable } from 'rxjs';
import { map } from 'rxjs/operators';
@Injectable()
export class MyInterceptor implements HttpInterceptor {
intercept(req: HttpRequest, next: HttpHandler): Observable> {
return next.handle(req).pipe(
map(response => {
// 修改响应的数据
const modifiedResponse = response.clone({ body: { data: 'Modified data' } });
return modifiedResponse;
})
);
}
}
在上面的示例中,我们使用map
操作符来修改响应的数据。你可以根据需要使用其他操作符来处理Observable的数据流。
最后,记得将自定义的HttpInterceptor添加到Angular应用的providers数组中,以便它可以被应用使用:
import { NgModule } from '@angular/core';
import { HTTP_INTERCEPTORS } from '@angular/common/http';
import { MyInterceptor } from './my-interceptor';
@NgModule({
providers: [
{ provide: HTTP_INTERCEPTORS, useClass: MyInterceptor, multi: true }
]
})
export class AppModule { }
这样,Angular应用就会在每个HTTP请求中使用你的拦截器了。