在执行rxjs的一些可管道运算符之后,是否可以拦截httpclient get请求。在我的例子中,我有一个自动生成的http服务,它将blob响应转换为对象。我的全局错误拦截器也需要转换blob,因为它在服务中的可管道运算符之前触发。
伪代码示例:
我的请求:
this.httpClient.get('api/something')
.pipe(map(x => ({modified: true})))
.subscribe();
我的httpclient拦截器:
intercept(req, next) {
return next.handle(req)
.pipe(tap(x => {console.log(x);}));
}
期望的行为:
console.log应该从map操作符输出我修改过的对象。看来拦截器永远是链中的第一部分。
我的问题:
能达到我想要的输出吗?
溴
最佳答案
实际上,我们最终创建了一个函数来将blob转换为有用的内容:
TypeScript:
private transformBlobToJson = (
response: HttpResponseBase
): Promise<string> => {
return new Promise(resolve => {
const responseBlob =
response instanceof HttpResponse
? response.body
: (<any>response).error instanceof Blob
? (<any>response).error
: undefined;
blobToText(responseBlob)
.pipe(
map(responseText => {
if (responseText !== null) {
const responseObject: ICustomResponseModel = JSON.parse(
responseText
);
return responseObject.message
? responseObject.message
: responseObject.title;
}
return null;
})
)
.subscribe(res => {
return resolve(res);
});
});
}
function blobToText(blob: any): Observable<string> {
return new Observable<string>((observer: any) => {
if (!blob) {
observer.next('');
observer.complete();
} else {
const reader = new FileReader();
reader.onload = event => {
observer.next((<any>event.target).result);
observer.complete();
};
reader.readAsText(blob);
}
});
}