gpt4 book ai didi

angular - rxjs 管道运算符之后的 HttpInterceptor

转载 作者:太空狗 更新时间:2023-10-29 19:33:00 26 4
gpt4 key购买 nike

是否有可能在执行 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 运算符输出我修改的对象。似乎拦截器始终是链中的第一部分。

我的问题:是否有可能实现我想要的输出?

BR

最佳答案

我们实际上最终创建了一个函数来将 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);
}
});
}

关于angular - rxjs 管道运算符之后的 HttpInterceptor,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49865672/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com