Android Retrofit嵌套请求-RxJava 3

说明:在实际开发中,可能会存在需要先请求A接口,再去请求B接口的情况。比如需要请求获取收藏文章列表,但是需要先登录拿到Cookie才能请求收藏文章列表接口,此时请求就有了先后顺序,使用RxJava 3进行嵌套请求

注:本文使用wanandroid API开放平台 https://www.wanandroid.com/blog/show/2里面的接口。

添加RxJava 3和Rxandroid依赖

implementation "com.squareup.retrofit2:adapter-rxjava3:2.9.0"
implementation "io.reactivex.rxjava3:rxandroid:3.0.0"

第一步:根据Http接口创建Java接口

WanAndroidService2.java

package com.cdw.studyokhttp;
import io.reactivex.rxjava3.core.Flowable;
import okhttp3.ResponseBody;
import retrofit2.Call;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.GET;
import retrofit2.http.POST;
import retrofit2.http.Path;

public interface WanAndroidService2 {
    //登录
    @POST("user/login")
    @FormUrlEncoded
    Flowable<BaseResponse> login2(@Field("username") String username, @Field("password") String pwd);

    //获取收藏文章列表
    @GET("lg/collect/list/{pageNum}/json")
    Flowable<ResponseBody>getArticle(@Path("pageNum") int pageNum);

}

第二步:配置RxJava适配器,嵌套请求

Retrofit retrofit3=new Retrofit.Builder()
            .baseUrl("https://www.wanandroid.com")
            .callFactory(new OkHttpClient.Builder()
                   .build())
            .addConverterFactory(GsonConverterFactory.create())//添加转换器
            .addCallAdapterFactory(RxJava3CallAdapterFactory.create()) //添加适配器
            .build();
    WanAndroidService2 wanAndroidService3=retrofit3.create(WanAndroidService2.class);

    @Test
    public void rxjavaTest() {
        wanAndroidService3.login2("111111","111111")

                //根据login2继续生成一个Publisher,Publisher返回一个请求文章列表
                .flatMap(new Function<BaseResponse, Publisher<ResponseBody>>() {
                    @Override
                    public Publisher<ResponseBody>apply(BaseResponse baseResponse) throws Throwable {
                            return wanAndroidService3.getArticle(0);
                    }
                })
                //网络请求切换到一个单独的子线程
                .observeOn(Schedulers.io())
                //Schedulers.newThread:总是启用新线程,并在新线程执行操作 在Android中则改为在Android主线程:.subscribeOn(AndroidSchedulers.mainThread())
                .subscribeOn(Schedulers.newThread())
                //返回结果的回调
                .subscribe(new Consumer<ResponseBody>() {
                    @Override
                    public void accept(ResponseBody responseBody) throws Throwable {
                        System.out.println(responseBody.string());
                    }
                });
        while (true){

        }
    }

第三步:配置Cookie

 Map<String,List<Cookie>>cookies=new HashMap<>();
    Retrofit retrofit3=new Retrofit.Builder()
            .baseUrl("https://www.wanandroid.com")
            //传递一个okp,才能实现cookie
            .callFactory(new OkHttpClient.Builder()
                    .cookieJar(new CookieJar() {
                        //保存的数据
                        @Override
                        public void saveFromResponse(@NotNull HttpUrl httpUrl,@NotNull List<Cookie> list) {
                            cookies.put(httpUrl.host(),list);
                        }
                        //传递请求的接口
                        @NotNull
                        @Override
                        public List<Cookie> loadForRequest(@NotNull HttpUrl httpUrl) {
                            List<Cookie>cookies=WanAndroidUnitTest.this.cookies.get(httpUrl.host());
                            return cookies==null?new ArrayList<>() : cookies;
                        }
                    }).build())
            .addConverterFactory(GsonConverterFactory.create())//添加转换器
            .addCallAdapterFactory(RxJava3CallAdapterFactory.create()) //添加适配器
            .build();
    WanAndroidService2 wanAndroidService3=retrofit3.create(WanAndroidService2.class);

    @Test
    public void rxjavaTest() {
        wanAndroidService3.login2("111111","111111")

                //根据login2继续生成一个Publisher,Publisher返回一个请求文章列表
                .flatMap(new Function<BaseResponse, Publisher<ResponseBody>>() {
                    @Override
                    public Publisher<ResponseBody>apply(BaseResponse baseResponse) throws Throwable {
                            return wanAndroidService3.getArticle(0);
                    }
                })
                //网络请求切换到一个单独的子线程
                .observeOn(Schedulers.io())
                //Schedulers.newThread:总是启用新线程,并在新线程执行操作 在Android中则改为在Android主线程:.subscribeOn(AndroidSchedulers.mainThread())
                .subscribeOn(Schedulers.newThread())
                //返回结果的回调
                .subscribe(new Consumer<ResponseBody>() {
                    @Override
                    public void accept(ResponseBody responseBody) throws Throwable {
                        System.out.println(responseBody.string());
                    }
                });
        while (true){

        }
    }

结束

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值