2017-11-30 13 views
0

私はangleの購読を使用してhttpリクエストを作成することに新しいので、可能かどうかわかりません(ただし、約束で1度作った) 私は、nativescriptアプリで、角度HttpClient私の独自のインターセプターで、私はhttps://angular.io/guide/http#intercepting-all-requests-or-responsesのように2番目のHttpClientでネストされたリクエスト

のトークンが得られます。私は401の応答を受け取り、新しいログイン要求を行い、新しいトークンで再度要求をやり直します。私はかつてのような(カスタムサービスで)約束を使用してそれを実現

... 
next.handle(newRequest) 
     .catch((response: HttpErrorResponse) => { 
      if (response.status === 401) { 
       return next.handle(new HttpRequest("POST", loginUrl, credentials)) 
         .subscribe((event: HttpEvent<any>) => { 
          if (event instanceof HttpResponse) { 
           BackendService.token = event.body.token; 
           return next.handle(newRequest).subscribe(); 
          } 
         }) 
        ); 
      } 
      return Observable.throw(response); 
     }) 

はので、私はこのようなsomethink(動作しない)を作っ

request.catch((response: HttpErrorResponse) => { 
    if(response.status === 401) { 
     return http.post(loginUrl, credentials) 
      .then(response => { 
       return requestWithNewToken; 
      }, error => { 
       ... redirect UI to login -> login with saved credentials failed 
      }) 
    } 
}) 

私が対処したいと思いますインターセプタを介してすべてがサービスのinsted。

+0

あなたはnext.handle戻り、そこにいくつかのparamsを渡します。それは間違っているかもしれない。私はObservableを返す必要があると思います。余分なリクエストをして、それをmergeする必要があります。それをnext.handleにマッピングしてください。 'のようなもの' return this.http.post( 'get-new-token'、someData).mergeMapTo(next.handle(response)) ' –

+0

' next.handle'は 'Observable'を返します。問題は私が毎回両方のリクエストを 'mergeMapTo'したいのではなく、最初にリクエストを試して失敗した場合(トークンが期限切れになっている)、それを返す(ログイン要求と新しいトークンで同じリクエスト) – wendt88

+0

"失敗した場合"です。うんつまり、あなたのコードを '.catch'に入れるのです。この場合、次のようになります。return next.handle(req).mergeMap((data)=>エラーの場合はthis.http.post( 'get-new-token'、someData).mergeMapTo(next.handle(response) )else else Observable.throw(request))。subscribe() ' –

答えて

1

[OK]を、私はそれを解決し、ハードがしようとのaftersome時間:

return next.handle(newRequest) 
     .catch((res: HttpErrorResponse) => { 
      if (res.status === 401) { 
       return next.handle(new HttpRequest("POST", loginUrl, credentials)) 
        .mergeMap((event: HttpEvent<any>) => { 
         if (event instanceof HttpResponse) { 
          //save new token somewhere 
          //return a clone of the request replacing Authorization header with new token 
          return next.handle(newRequest.clone({ headers: newRequest.headers.set("Authorization", event.body.token) })); 
         } 
         return Observable.of(event); 
        }); 
      } 
      return Observable.throw(res); 
     }) 
関連する問題