1

나는이 인터셉터를 가지고 :HttpClient를 토큰 새로 고침

import {Observable} from 'rxjs/Observable'; 
import {Injectable} from '@angular/core'; 
import {HttpEvent, HttpInterceptor, HttpHandler, HttpRequest, HttpErrorResponse, HttpParams} from '@angular/common/http'; 

import {SessionStorageService} from 'ng2-webstorage'; 

@Injectable() 
export class HttpInterceptorService implements HttpInterceptor { 
    constructor(private sessionStorage: SessionStorageService) { 
    } 
    intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> { 
     const url = '/'; 
     req = req.clone({ 
      url: url + req.url, 
      headers: req.headers.set('Authorization', this.sessionStorage.retrieve('access_token')) 
     }); 
     return next.handle(req).catch(err => { 
      if (err instanceof HttpErrorResponse) { 
       console.log('interceptor error'); 
       console.log(err); 
       if (err.status === 401) { 

        return Observable.throw(err); 
       } 


      } 
     }); 

    } 
} 

나는 만료 된 때 ​​전류 (PARAMS 일부 'URL'에 최종 요청) 새로운 토큰을 얻을 수있다 필요로하고 내가 어떤에 응답 (401)을받을 경우 요청한 다음 새로운 토큰을 얻을 때까지 요청 (및 다른 모든 요청)을 보류하십시오. 그리고 refresh_token도 만료 되었으면 (또한 401이 붙은 경우) 다른 작업을 수행하십시오.

params: new HttpParams().set('Token', this.sessionStorage.retrieve('refresh_token')) 

새 토큰 요청 방법을 이해할 수 없습니다. 내가

if (err.status === 401) { 
        const params = new HttpParams().set('token', this.sessionStorage.retrieve('refresh_token')); 
        req = req.clone({ 
         method:'post', 
         url: url + '/auth/refresh', 
         params: params, 
         headers: req.headers.set('Authorization', this.sessionStorage.retrieve('refresh_token')) 
        }); 
        next.handle(req).subscribe(res => { 

         console.log('res',res); 
        }); 
        return Observable.throw(err); 
       } 

다음했다하지만 내 데이터에 대한 body 및 기타 불필요한와 res있어 무엇

. body에서 data 만 수신하려면 어떻게해야합니까?

Property '_body' does not exist on type 'HttpEvent<any>'. 
Property '_body' does not exist on type 'HttpSentEvent'. 

res['body'] 내게하는 데 도움이 : 나는 res.body 또는 res._body 또는 res.text()처럼 뭔가를하려고 할 때

나는 같은 오류가 발생했습니다. 하지만 문자열 데이터가 있습니다. 내가 시도한 때 JSON.parse(res['body']); 내 요청 상태는 cancel입니다. 그리고 나는 그 요청을 할 수 없다.

if (res instanceof HttpResponse) { 
    const body = res.body; 
    // to something with the response body 
} 

docs에서 찾을 수 있습니다 :

+0

당신은 시도 할 수 있습니다 : 당신이'401'을 받고 있다면'res.json는()' – edkeveked

+0

는'HttpErrorResponse' 유형을 처리해야 의미합니다. 그 중 하나는 당신이 필요로하는'error' 특성을 가지고 있습니다 : 그것은 오류 응답 본문에서 반환 된 어떤 서버를 포함합니다. ref : https://angular.io/api/common/http/HttpErrorResponse (설명 섹션 참조) –

답변

0

next.handle(req)의 응답은 실제 응답 이벤트에 관심이 있다면 당신이해야 할, 유형 HttpEvent 있습니다.