2017-10-16 3 views
0

로그인 페이지가있는 프로젝트가 있습니다. 이 페이지에서 사용자가 "로그인"을 클릭 한 후 checkUserName에 요청을 보내야합니다 (해당 사용자가 있고 로그인 할 수 있는지 확인). 그런 다음에 만 인증합니다. ,rxjava를 사용하여 auth에 대한 두 요청 작업

public Flowable<AccountResponse> auth(String login, String password) { 
    return checkUsername(login).flatMap(checkUsernameResponse -> restService.auth(login, password)) 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .doOnNext(loginResponse -> { 
       tokenManager.saveToken(loginResponse.getToken()); 
      }); 
} 

public Flowable<CheckUsernameResponse> checkUsername(String login) { 
    return restService.checkUserName(login) 
      .subscribeOn(Schedulers.io()); 
} 

내가 수신에서 확인할 수 있습니다 방법 :

인터페이스 :

@POST("endpoint") 
Flowable<AccountResponse> auth(@Body AuthRequestBody authRequestBody); 

@POST("endpoint") 
Flowable<CheckUsernameResponse> checkUserName(@Body CheckUserNameRequest checkUserNameRequest); 

RestService :

public Flowable<AccountResponse> auth(String login, String password) { 
    return api.auth(new AuthRequestBody(login, password)).compose(handleError()); 
} 

public Flowable<CheckUsernameResponse> checkUserName(String login) { 
    return api.checkUserName(new CheckUserNameRequest(login)).compose(handleError()); 
} 

와 RX 코드에서

나는 이것을 가지고 첫 번째 쿼리가 괜찮 으면? (checkUsername). 그 API는 오류 메시지를 반환하지 않았고, UserId는 정상이며 isAccessGranted는 true이고 두 번째 요청을 인증에 보내겠습니까?

답변

0

flatMap 내부에는 새로운 Flowable을 반환하거나 오류가 발생하기 전에 원하는 확인/유효성 검사를 수행 할 수 있습니다. 그러므로 간결함을 위해 스케줄러 고려 사항을 생략하면 다음을 가질 수 있습니다.

public Flowable<AccountResponse> auth(String login, String password) { 
     return checkUsername(login) 
      .flatMap(checkUsernameResponse -> { 
       // do whatever checking you want to do here, e.g.: 
       if (!checkUsernameResponse.isUsernameOk()) { 
        throw new RuntimeException("Access not granted.")); 
       } 
       // First call succeeded, proceed to the second one: 
       return restService.auth(login, password); 
      }) 
      .doOnNext(loginResponse -> { 
       tokenManager.saveToken(loginResponse.getToken()); 
      }); 
     } 
관련 문제