4

在执行一些 rxjs 的可管道操作符后,是否可以拦截 HttpClient 获取请求。就我而言,我有一个自动生成的 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 应该从地图操作员输出我修改的对象。拦截器似乎总是链中的第一部分。

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

BR

4

1 回答 1

0

我们实际上最终创建了一个函数来将 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);
        }
      });
    }
于 2019-06-22T19:29:09.913 回答