Angular 6 - HttpInterceptors - HttpResponse 主体未被修改
Angular 6 - HttpInterceptors - HttpResponse body not getting modified
我只是在实施 HttpInterceptor
,我想 base64
对请求正文进行编码,base64
对响应正文进行解码。
- 方法:HTTP Post 请求/响应
- 数据格式:json(这应该
被编码/解码)
这是我完成的代码。当我调试它时,解码数据(即)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);
}));
}
我使用 map 而不是 tap 成功获得了修改后的响应主体:
return next.handle(requestClone).pipe(map(event => {...}));
这是因为 map 与 tap 的行为:
来自tap documentation:
"Perform a side effect for every emission on the source Observable, but return an Observable that is identical to the source."
来自map documentation:"Applies a given project function to each value emitted by the source Observable, and emits the resulting values as an Observable."
我只是在实施 HttpInterceptor
,我想 base64
对请求正文进行编码,base64
对响应正文进行解码。
- 方法:HTTP Post 请求/响应
- 数据格式:json(这应该 被编码/解码)
这是我完成的代码。当我调试它时,解码数据(即)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);
}));
}
我使用 map 而不是 tap 成功获得了修改后的响应主体:
return next.handle(requestClone).pipe(map(event => {...}));
这是因为 map 与 tap 的行为:
来自tap documentation: "Perform a side effect for every emission on the source Observable, but return an Observable that is identical to the source."
来自map documentation:"Applies a given project function to each value emitted by the source Observable, and emits the resulting values as an Observable."