在执行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);
        }
      });
    }

09-25 15:39