HttpInterceptor после конвейерных операторов rxjs

Можно ли перехватить запрос get HttpClient после выполнения некоторых конвейерных операторов rxjs. В моем случае у меня есть автоматически сгенерированный http-сервис, который преобразует ответы 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

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);
        }
      });
    }
Другие вопросы по тегам