【问题标题】:HttpInterceptor change response body based on value from other observableHttpInterceptor 根据来自其他 observable 的值更改响应主体
【发布时间】:2017-12-06 03:11:43
【问题描述】:

有些我似乎无法根据来自另一个可观察对象的值更改响应正文,我只能在检索响应后才能获得。

更改请求很简单,我不知道如何处理响应。

@Injectable()
export class MyHttpInterceptor implements HttpInterceptor {
  constructor(private _injector: Injector) {
  }

  intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
    return next.handle(request).map((event: HttpEvent<any>) => {
      if (!(event instanceof HttpResponse)) return event;             

      const translateService = this._injector.get(TranslateService);

      // retrieved the key from the reponse, now need to retrieve data from the translateservice   
      translateService.get(`${event.body.key}`).subscribe((value: string) => {
        event.body.message = value;
      });

       // how to return new response ??  
      return event.clone({ body: event.body });  
    });
  }
}

所以基本上我想返回一个带有新属性“消息”的新响应体。

【问题讨论】:

    标签: javascript angular typescript angular-http-interceptors


    【解决方案1】:

    由于您不能直接更改响应正文,因此您必须返回一个克隆的。最终答案见下文。

    @Injectable()
    export class MyHttpInterceptor implements HttpInterceptor {
      constructor(private _injector: Injector) {
      }
    
      intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
        const translateService = this._injector.get(TranslateService);
    
        return next.handle(request)
            // filter out only events that HTTP event.
            .filter((event: HttpEvent<any>) =>(event instanceof HttpResponse))
            //then switch the observable to get the response of the translate service.
            .switchMap(event => translateService.get(`${event.body.key}`)
                .map(value => event.clone({ body: { message:value } }));
        });
      }
    }
    

    【讨论】:

      【解决方案2】:

      由于拦截返回并且可观察,您可以将其切换映射到翻译服务的 getEvent。喜欢这样

      @Injectable()
      export class MyHttpInterceptor implements HttpInterceptor {
        constructor(private _injector: Injector) {
        }
      
        intercept(request: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {
          const translateService = this._injector.get(TranslateService);
      
          return next.handle(request)
              // filter out only events that HTTP event.
              .filter((event: HttpEvent<any>) =>(event instanceof HttpResponse))
              //then switch the observable to get the response of the translate service.
              .switchMap(event => translateService.get(`${event.body.key}`)
                  .map(value=>event.body.message=value)));
      
          });
        }
      }
      

      【讨论】:

      • 这将解析为 translateService.get 的值?我们如何将该值附加到正文中?
      • 我向 translateService.get() 添加了另一个映射,它应该映射并返回 eventbody.message 值作为来自 get() 函数的值。
      • 我无法直接写入正文,所以我不得不进行克隆事件。感谢您让我走上正确的道路:)。看我的回答。为最终结果
      猜你喜欢
      • 1970-01-01
      • 2022-07-28
      • 2022-08-04
      • 1970-01-01
      • 2018-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多