【问题标题】:Chain Retrofit calls for authorization and subsequent calls using RxJava使用 RxJava 进行链式改造调用授权和后续调用
【发布时间】:2019-08-01 07:54:02
【问题描述】:

我是 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

请建议我如何实现这一目标。

【问题讨论】:

    标签: android authorization rx-java retrofit2 chain


    【解决方案1】:

    subscribe(...) 将返回一个订阅 尝试编辑您的代码,使方法返回这样的订阅

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

    【讨论】:

    • 它仍然无法编译,它说。必需:org.reactivestreams.Subscription Found:void
    • 导入 rx.subscriptions.Subscriptions.Subscription。尝试编辑 getStoreDetailsObservable 方法。
    • 导入 rx.subscriptions.Subscriptions.Subscription。它不是编译,其他导入看起来像 io.reactivex.Observable。我正在使用 Android rx,它有什么不同吗?谢谢
    • 好的,如果我听从你的建议,observeOn 现在不会编译
    • ^^ 联系电报 BananaDried,我来帮你
    猜你喜欢
    • 1970-01-01
    • 2017-01-11
    • 1970-01-01
    • 1970-01-01
    • 2016-11-24
    • 2020-11-11
    • 1970-01-01
    • 1970-01-01
    • 2018-05-03
    相关资源
    最近更新 更多