2017-12-15 12 views
1

나는 HttpInterceptor api의 새로운 각도 인 HttpClientModule을 사용하고 있으며 상황에 처해있다. 여기에 나의 유스 케이스가있다.실제 호출하기 전에 다른 httpCall 호출하기 각도의 HttpInterceptor

내 응용 프로그램에서 어떤 서비스가 http 호출을하면 그 전에 또 다른 자동 http 호출을 만들고 그 결과를 로컬로 저장하려고합니다. 자동 통화가 완료되면 서비스의 http 호출을 진행하고 그 결과를 반환합니다.

내가하는 일은 다음과 같습니다. 성공적으로 내부 침묵 호출을 실행하고, 위의 코드에 문제가 지금

intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { 
    if (req.url.match(/api\//)) { // api call 
      http.post('/auth/silentCall', {user: 123}).subscribe(
        (data) => { 
         console.log(data); 
         const clone = req.clone({ setHeaders: { 'Authorization ': tokenService.getToken() } }); 
         return next.handle(clone).do((event: HttpEvent<any>) => { 
          if (event instanceof HttpResponse) { 
           console.log('Service's call response'); 
          } 
         }, (err: any) => { 
          if (err instanceof HttpErrorResponse) { 
           console.log('Network call err', err); 
          } 
         }); 
        }, 
        (err) => { 
         if (err instanceof HttpErrorResponse) { 
          return Observable.throw(err); 
         } 
       ); 
       } else { 
     console.log('Not an api call..It's an auth call'); 
     return next.handle(req); // call original auth request. 
    } 
} 

을 (HttpInterceptor 사용), 그러나 결코 그 후 원래의 API 호출을 호출하지 않습니다. 따라서 서비스는 영원히 기다리고 있습니다.

+0

실제 서비스 요청을 게시하시기 바랍니다 (가입의 경우, 또는 에러 핸들러 함수)를 호출하기 때문에

는 또한 만약 조건이 제거 된 있습니다. –

답변

2

업데이트을보십시오. https://plnkr.co/edit/WFecj8fFZ6z4G6mpLSCr?p=preview

브라우저의 dev 도구를 사용하여 호출중인 시퀀스와 추가되는 헤더를 기록해 두십시오.

또한 아래의 솔루션


(어떤 다른 행동 ... 코드가 컴파일되지 않는 경우에이 메모를 추가하지 말았어야) 대신에 표준 연산자 lettable 연산자를 RxJS을 사용하고 있습니다

문제의 원인은 메서드가 호출이 /api과 일치하는 경우 핸들을 반환하지 않는다는 사실입니다.

업데이트 http.post의 응답이 next.handle() 방법으로 또는 Observable.throw()과 종료 관찰 던져로 돌아 관찰 순서를 반환 flatmaped되고 있음을 다음

intercept(req: HttpRequest<any>, next: HttpHandler):Observable<HttpEvent<any>> { 
    if (req.url.match(/api\//)) { // api call 
      return http.post('/auth/silentCall', {user: 123}).pipe(switchMap((response) => { 
       console.log('Service's call response'); 

       let clone = req.clone({ setHeaders: { 'Authorization ': tokenService.getToken() } }); 
       return next.handle(clone); 
      }), catchError((err) => { 
       if(err instanceof HttpErrorResponse) { 
        console.log('Your logging here...'); 
        let clone = req.clone({ setHeaders: { 'Authorization ': tokenService.getToken() } }); 
        return next.handle(clone); 
       } 

       return Observable.throw(err); 
      })); 
    } else { 
     return next.handle(req); // call original auth request. 
    } 
} 

주와 비슷한 뭔가 코드. API 호출이 실패 할 경우, catch 블록이

+0

아니, 작동하지 않았다. 디버깅 결과가 동일하지만 아무런 오류없이 아무런 개선이 없었다 ... 자동 전화를 걸지만 실제 서비스 호출을 호출하지 않는다. –

+0

뭔가 잘못하고 있어야합니다. 작동중인 plunkr으로 업데이트했습니다. 접근 방식을 작동 시키려면 ** 비추천 ** HTTP 서비스를 사용해야합니다. HttpInterceptor 내에서 HttpClient 서비스를 사용하여 호출을 수행 할 수 없으므로 순환 종속성이 생성됩니다. –

+0

Jean에게 감사하지만 최신 버전, 즉 HttpClient를 사용하지 않으시겠습니까? 주기적인 종속성을 피하기 위해 반사 사출을 사용할 수 있습니다. 새 버전으로 할 수 있습니까? Bcoz, 반사 사출을 사용했으며 인터셉터 내에서 시작된 자동 통화에 작동합니다. –

0

if 안에 반환하지 않습니다. 추가 작업 plunkr이

return http.post('/auth/silentCall', {user: 123}).subscribe(
+0

silentCall에 반환하면 실제 서비스 호출 응답에 return 문을 쓸 수 없으며 여전히 호출은 next.handle (복제)을 실행하지 않습니다. 죄송합니다. 개량. –