我只是实现HttpInterceptor
,在这里我想base64
编码请求正文,base64
解码响应正文。
这是我完成的代码。当我对其进行调试时,已解码的数据(即json)被重新设置为event.body
。但是,它并没有在服务中得到接收,实际上是进行了http呼叫
@Injectable()
export class Base64Interceptor implements HttpInterceptor {
constructor(private base64UtilService: Base64UtilService) {
}
intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
let requestClone = request.clone(
{
body: this.base64UtilService.encode(JSON.stringify(request.body)),
responseType: 'text'
}
)
return next.handle(requestClone).pipe(tap(event => {
if (event instanceof HttpResponse) {
debugger;
let decodedData = this.base64UtilService.decode(event.body);
event = event.clone({
body: decodedData
});
return event;
}
},
(err: any) => {
if (err instanceof HttpErrorResponse) {
console.log(err);
}
}))
}
}
我得到的回复实际上是来自服务器的,event.body
的解码未反映出来。谢谢你的时间
这是拨打http的方式
sendActivationRequest(url: string, request: MyRequest): Observable<MyResponse> {
return this.httpClient.post<MyResponse>(url, request)
.pipe(map((response: MyResponse) => {
return response;
}), catchError((error) => {
return throwError(error);
}));
}
答案 0 :(得分:1)
我使用地图而不是点击成功获得了修改后的响应正文:
return next.handle(requestClone).pipe(map(event => {...}));
这是由于地图与点击行为所致:
从tap documentation: “对源Observable上的每个发射执行副作用,但返回与源相同的Observable。”
从map documentation:“将给定的项目函数应用于源Observable发出的每个值,并将结果值作为Observable发出。”