Search code examples
androidauthorizationrx-javaretrofit2chain

Chain Retrofit calls for authorization and subsequent calls using RxJava


I am a new with Rxjava. I want to capture access token (received as part of headers) from the response of the first api call and then use that access token (as header) for subsequent api calls.

Note: the in the first api call, the response has no body,only headers are returned.

My Network Interface:

public interface NetworkInterface {

@POST("https://appauth.treuspan/Login")
Observable<Response<Void>> getAuthDetails(
        @Header("Content-Type") String contentType,
        @Body AuthRequestDetails authRequestDetails
        );

@POST("https://appauth.treuspan//storedetails")
Observable<StoreDetailsResponse> getStoreDetails(
        @Header("Content-Type") String contentType,
        @Header("Accept") String accept,
        @Header("Authorization") String authorization,
        @Body AuthRequestBody authRequestBody
        );
}

My observable methods:

    public Observable<Response<Void>> getAuthObservable() {

    return NetworkClient.getRetrofit().create(NetworkInterface.class)
            .getAuthDetails("application/x-www-form-urlencoded",
                    new AuthRequestDetails().getAuthRequestDetails())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Observer<Response<Void>>() {
                @Override
                public void onSubscribe(Disposable d) {

                }

                @Override
                public void onNext(Response<Void> voidResponse) {
                    String access_token_received = voidResponse.headers().get("access_token");
                }

                @Override
                public void onError(Throwable e) {

                }

                @Override
                public void onComplete() {

                }
            });

The above doesn't compile. Its compile says:

Incompatible type:
required: io.reactivex.Observable<retrofit2.Response<java.lang.Void>>
Found:    void

If I am able to successfully make the above call then i have to use the access token as part of header in the subsequent call as follows

public Observable<StoreDetailsResponse> getStoreDetailsObservable() {
    return NetworkClient.getRetrofit().create(NetworkInterface.class)
            .getStoreDetails("application/x-www-form-urlencoded",
                    "application/json",
                    "Bearer access_token_received",
                    new AuthRequestBody().getAuthRequestBody())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Observer<StoreDetailsResponse>() {
                @Override
                public void onSubscribe(Disposable d) {

                }

                @Override
                public void onNext(StoreDetailsResponse response) {

                }

                @Override
                public void onError(Throwable e) {

                }

                @Override
                public void onComplete() {

                }
            });
}

The above code also doesn't compile. It says:

Incompatible type:
required: io.reactivex.Observable<com.example.androidtest.model.StoreDetailsResponse>
Found:    void

Please suggest how can i achieve this.


Solution

  • subscribe(...) will return a Subscription Try to edit your code, make method return a Subscription like this

        public Subscription getAuthObservable() {
    
            return NetworkClient.getRetrofit().create(NetworkInterface.class)
                .getAuthDetails("application/x-www-form-urlencoded",
                        new AuthRequestDetails().getAuthRequestDetails())
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<Response<Void>>() {
                    @Override
                    public void onCompleted() {
    
                    }
    
                    @Override
                    public void onError(Throwable e) {
    
                    }
    
                    @Override
                    public void onNext(Response<Void> voidResponse) {
                        String access_token_received = voidResponse.headers().get("access_token");
                    }
                });
          }