在rxjs可管理运算符之后的HttpInterceptor

时间:2018-04-16 20:25:23

标签: 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();

我的HttpClient拦截器:

intercept(req, next) {
    return next.handle(req)
               .pipe(tap(x => {console.log(x);})); 
}

所需行为: console.log应该从map运算符输出我修改过的对象。似乎拦截器始终是链中的第一部分。

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

BR

1 个答案:

答案 0 :(得分:0)

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