【问题标题】:Android: RxJava with OkHttp: How to make second call which is dependent on first?Android:带有OkHttp的RxJava:如何进行依赖于第一个的第二个调用?
【发布时间】:2017-04-14 06:08:53
【问题描述】:

我没有使用 Retrofit。 我必须进行第一次调用以获取身份验证 cookie,然后我需要使用相同的 OkHttclient 客户端进行第二次调用(实际上我假设由于身份验证 cookie 我需要相同的客户端)。因此,当第一个 http 调用完成时,我需要使用相同的客户端变量再次调用另一个 url。我怎样才能干净地做到这一点?

我认为我可以使用 .concatWith(参见下面的代码),但我不确定这是否正确,因为我找不到任何可靠的示例。

 Subscription subscription =   Observable.create(new Observable.OnSubscribe<Response>() {

                    OkHttpClient client = new OkHttpClient.Builder()
                    .cookieJar(new CookieJar() {
                        private final HashMap<HttpUrl, List<Cookie>> cookieStore = new HashMap<>();

                        @Override
                        public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
                            cookieStore.put(url, cookies);
                        }

                        @Override
                        public List<Cookie> loadForRequest(HttpUrl url) {
                            List<Cookie> cookies = cookieStore.get(url);
                            return cookies != null ? cookies : new ArrayList<Cookie>();
                        }
                    })
                    .build();


                    @Override
                    public void call(Subscriber<? super Response> subscriber) {
                        try {
                            HttpUrl.Builder urlBuilder = HttpUrl.parse(AUTHTOKEN_URL).newBuilder();
                            urlBuilder.addQueryParameter("username", AUTHTOKEN_USERNAME);
                            urlBuilder.addQueryParameter("password", AUTHTOKEN_PASSWORD);
                            String url = urlBuilder.build().toString();

                            Request request = new Request.Builder()
                                    .url(url)
                                    .build();

                            Response response = client.newCall(request).execute();

                            subscriber.onNext(response);
                            subscriber.onCompleted();

                            if (!response.isSuccessful()){
                                subscriber.onError(new Exception("error"));
                            }

                        }
                        catch (IOException e) {
                            subscriber.onError(e);
                        }
                    }
                })
                .subscribeOn(Schedulers.io())
                .observeOn(AndroidSchedulers.mainThread())
                .concatWith(

                    //what code goes here??
                )
                .subscribe(new Subscriber<Response>() {
                    @Override
                    public void onCompleted() {

                    }

                    @Override
                    public void onError(Throwable e) {

                    }

                    @Override
                    public void onNext(Response response) {

                    }
                });

                return subscription;
    }

【问题讨论】:

标签: android rx-java okhttp3


【解决方案1】:

查看代码RxJava方式

    //Create your customized OkHttpClient
  final OkHttpClient client = new OkHttpClient.Builder()
            .cookieJar(new CookieJar() {
                private final HashMap<HttpUrl, List<Cookie>> cookieStore = new HashMap<>();

                @Override
                public void saveFromResponse(HttpUrl url, List<Cookie> cookies) {
                    cookieStore.put(url, cookies);
                }

                @Override
                public List<Cookie> loadForRequest(HttpUrl url) {
                    List<Cookie> cookies = cookieStore.get(url);
                    return cookies != null ? cookies : new ArrayList<Cookie>();
                }
            })
            .build();


    Observable<AuthResponse> authObservable = Observable.fromCallable(new Func0<AuthResponse>() {
        @Override
        public AuthResponse call() {
            return doOkHttpAuthOperation(client);//You can do with your auth cookie and Login Credentials
        }
    });

    Observable<NormalResponse> normalObservable = authObservable.map(new Func1<AuthResponse, NormalResponse>() {
        @Override
        public NormalResponse call(AuthResponse authResponse) {
            return doOkHttpNormalOperation(client);//Normal API call
        }
    });


    Subscription subscription = normalObservable.subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Subscriber<NormalResponse>() {
                @Override
                public void onCompleted() {

                }

                @Override
                public void onError(Throwable e) {
                    //if Any Error occurred
                }

                @Override
                public void onNext(NormalResponse normalResponse) {
                    //Authenticated Response
                }
            });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-20
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-02
    • 2019-01-27
    • 2021-05-26
    相关资源
    最近更新 更多