Angular rxjs可管道运算符之后的HttpInterceptor
在rxjs的一些可管道操作符执行之后,是否可以拦截HttpClient get请求。在我的例子中,我有一个自动生成的http服务,它将blob响应转换为对象。我的全局错误拦截器也需要转换blob,因为它在服务中的可管道操作符之前触发 伪代码示例: 我的要求是:Angular rxjs可管道运算符之后的HttpInterceptor,angular,rxjs,angular5,angular-httpclient,angular-httpclient-interceptors,Angular,Rxjs,Angular5,Angular Httpclient,Angular Httpclient Interceptors,在rxjs的一些可管道操作符执行之后,是否可以拦截HttpClient get请求。在我的例子中,我有一个自动生成的http服务,它将blob响应转换为对象。我的全局错误拦截器也需要转换blob,因为它在服务中的可管道操作符之前触发 伪代码示例: 我的要求是: this.httpClient.get('api/something') .pipe(map(x => ({modified: true}))) .subscribe();
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操作符输出我修改过的对象。似乎拦截器总是链中的第一部分
我的问题:
有可能达到我想要的输出吗
BR我们实际上创建了一个函数来将blob转换为有用的内容: 打字稿:
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);
}
});
}
private transformBlobToJson=(
响应:HttpResponseBase
):承诺=>{
返回新承诺(解决=>{
常量响应BLOB=
HttpResponse的响应实例
?响应。主体
:(响应)。Blob的错误实例
?(回答)。错误
:未定义;
blobToText(响应Blob)
.烟斗(
映射(responseText=>{
if(responseText!==null){
常量响应对象:ICustomResponseModel=JSON.parse(
响应文本
);
返回responseObject.message
?响应对象消息
:responseObject.title;
}
返回null;
})
)
.订阅(res=>{
返回解析(res);
});
});
}
函数blobToText(blob:any):可观察{
返回新的可观察对象((观察者:任意)=>{
如果(!blob){
观察员。下一个(“”);
observer.complete();
}否则{
const reader=new FileReader();
reader.onload=事件=>{
observer.next((event.target.result);
observer.complete();
};
reader.readAsText(blob);
}
});
}
您是否找到了解决此问题的方法?我们在NSwag生成的TS客户端上面临着完全相同的问题。不幸的是,没有:(我保留了我的变通解决方案。您的变通方法是什么?代码重复,因为我无法重用自动生成的私有blob reader函数