Android Retrofit嵌套请求-RxJava 3

Posted 森然献凉i

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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)

        
    

结束

以上是关于Android Retrofit嵌套请求-RxJava 3的主要内容,如果未能解决你的问题,请参考以下文章

Android Retrofit嵌套请求-RxJava 3

Android Retrofit嵌套请求-RxJava 3

Android OkHttp + Retrofit 取消请求的方法

RxjavaRetrofit返回json数据解析异常处理

RxjavaRetrofit返回json数据解析异常处理

【Android】Retrofit网络请求参数注解,@Path、@Query、@QueryMap...