Модернизация цепочки требует авторизации и последующих звонков с использованием RxJava - PullRequest
0 голосов
/ 11 марта 2019

Я новичок в Rxjava. Я хочу получить токен доступа (полученный как часть заголовков) из ответа на первый вызов API и затем использовать этот токен доступа (в качестве заголовка) для последующих вызовов API.

Примечание: в первом вызове API ответ не имеет тела, возвращаются только заголовки.

Мой сетевой интерфейс:

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
        );
}

Мои наблюдаемые методы:

    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() {

                }
            });

Выше не компилируется. Его компиляция говорит:

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

Если я могу успешно выполнить вышеуказанный вызов, тогда я должен использовать токен доступа как часть заголовка в следующем вызове следующим образом

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() {

                }
            });
}

Приведенный выше код также не компилируется. Это говорит:

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

Пожалуйста, подскажите, как мне этого добиться.

1 Ответ

1 голос
/ 11 марта 2019

подписка (...) вернет подписку Попробуйте отредактировать ваш код, заставить метод вернуть подписку, подобную этой

    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");
                }
            });
      }
...