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です。そして私はその要求をすることができません。あなたは、あなたがしなければならない実際の応答イベントに興味があるなら

+0

'res.json()' – edkeveked

+0

は、 'HttpErrorResponse'型を扱わなければならないことを意味する' 401'を取得していれば試すことができます。これはあなたが必要とするプロパティー 'error'を持っています。エラー応答本体に返されたサーバーを含みます。 ref:https://angular.io/api/common/http/HttpErrorResponse(説明のセクションをご覧ください) –

答えて

0

next.handle(req)からの応答は、タイプHttpEventがあります

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

詳細はdocsで見つけることができます。

関連する問題