2017-12-05 23 views
0

일부 응답 성 본문의 값을 기반으로 응답 본문을 변경할 수없는 것처럼 보입니다.HttpInterceptor 다른 관찰 가능 값을 기반으로 응답 본문을 변경하십시오.

요청을 변경하는 것은 매우 간단합니다. 응답과 함께하는 방법을 모르겠습니다.

@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 }); 
    }); 
    } 
} 

기본적으로 나는 새로운 속성 'message'가있는 새로운 응답 본체를 반환하려고합니다.

답변

1

인터셉트가 반환되고 관찰 할 수 있으므로 전환 서비스의 getEvent로 전환 할 수 있습니다. Like So

@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))); 

    }); 
    } 
} 
+0

translateService.get의 값으로 해석됩니까? 우리는 어떻게 그 가치를 몸에 붙일 수 있습니까? – Lars

+0

'translateService.get()'에 다른 맵을 추가하여 getbody() 함수의 값으로 eventbody.message 값을 매핑하고 반환해야합니다. – theOriginalJosh

+1

몸에 직접 쓸 수 없어 복제 된 이벤트를 만들어야했습니다. 나를 올바른 길로 가게 해주셔서 고마워. :). 내 대답을 보라. 최종 결과 – Lars

0

응답 본문을 직접 변경할 수 없으므로 복제 된 메시지를 반환해야합니다. 최종 답변은 아래를 참조하십시오.

@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 } })); 
    }); 
    } 
}