2016-08-29 5 views
0

자동 생성 AWS Android SDK를 사용하여 REST API에 액세스하고 있습니다. 예REST 호출을 RxJava로 마이그레이션하고 다른 재사용 가능한 방법으로 연결

Repos = restClient.getRepos(); 

이 호출은 비동기 작업에 있어야하지만

final Observable reposRx = Observable.fromCallable(() -> restClient.getRepos()); 

나머지 API를 사용하는 HTTP 클라이언트에 의해 관찰 가능한 그것을 변환하고있는 경우, 인증 토큰을 사용하여 I REST API에서 메서드를 실행하고 토큰이 만료되면 오류가 발생합니다. 따라서 REST 호출을 실행하기 전에 토큰이 만료되었는지 확인해야합니다 (이것은 변수를 검사하는 동기화 메서드에서 확인). if 만료 되었으면 다른 비동기 네트워크 호출을 실행하여 갱신해야합니다.

if(isTokenExpired()) { 
    refreshToken((new RefreshIdTokenCallback() { 
     @Override 
     public void onSuccess(final String idToken) 
     { 
     getRepos() 
     } 
     @Override 
     public void onFailure(final Throwable error) 
     { 
     //How to connect it with Rx 
     } 
     }); 
    } 
    else 
    { 
    getRepos() 
    } 

그래서 토큰이 갱신 된 후에 원래의 나머지 API 호출을 실행할 수 있습니다.

public void getRepos() 
    { 
    reposRx 
    .subscribeOn(Schedulers.newThread()) 
    .observeOn(AndroidSchedulers.mainThread())  
    .subscribe(new Subscriber<Repos>() { 
     @Override 
     public void onCompleted() { 
     } 
     @Override 
     public void onError(final Throwable e) { 
     } 
     @Override 
     public void onNext(final Repos repos) { 
      //update the list 
     } 
    }); 
} 

내가 새로 고침을 만료하고 REST API를 호출하는 경우, 토큰 만료를 확인 모든 REST API 메소드로 재사용 할 수있는 방법이 또한 RxJava에 모든 것을 변환하고 어떤 마술 방법이 있나요. 또한 onFailed를 연결합니까? (수신 모든)

+0

retrofit을 사용하면 Observable에서 응답을 반환하며 세션 토큰을 새로 고치려면 요청을 가로 챌 수 있습니다. http://stackoverflow.com/questions/25546934/retrofit-rxjava-and-session- 기반 서비스/25551689 # 25551689 – Than

+0

개조가 쉽지만이 기능을 개선 할 수는 없지만 Android 용 자동 생성 AWS SDK를 사용하고 있습니다. –

답변

0

이 API의 아무 생각이없는, 내가 그것을에서 처음 자상을 해보자 :

Observable<String> refresh = Observable.defer(() ->  
    Observable<String>.create(subscriber -> { 
    refreshToken(new RefreshIdTokenCallback() { 
     @Override 
     public void onSuccess(final String idToken) 
     { 
     subscriber.onNext(idToken); 
     subscriber.onComplete(); 
     } 
     @Override 
     public void onFailure(final Throwable error) 
     { 
     subscriber.onError(error); 
     } 
    }) 
    }) 
    .subscribeOn(Schedulers.newThread()) 
); 

Observable<?> checkExpiration = 
    Observable 
    .defer(() -> Observable.just(isTokenExpired())) 
    .flatMap(expired -> expired ? refresh : just("")); 

를 이제, 당신이 원하는 그러나 당신이 checkExpiration까지 연결할 수 있습니다; 그것은 하나의 더미 아이템을 방출합니다. 그리고 당신은 이것을 원하는 어떤 방식 으로든 map 또는 flatMap에 사용할 수 있습니다.