Android :Retrofit嵌套请求及适配器应用

Retrofit嵌套请求

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

嵌套请求:即用户想要获取收藏的文章,就要先登录、再获取。在代码实现就是先进行login登陆,成功后再获取对应信息。

依赖添加:

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

首先用户还是需要保存状态,用cookie来存储状态,用于获取文章时不会出现请登录等问题。
retrofit创建就需要cookie、gson以及适配器配置。

在实际调用就按代码流程,flatMap获取登陆后具体需要的内容,subscribe中的accept就是如何处理获取到的内容。

注意:在java测试环境中subscribeOn(Schedulers.newThread())用新线程,而在安卓开发中需要subscribeOn(AndroidSchedulers.mainThread())

适配器起到的作用是将接口中的方法返回值不限制于call,使其更加灵活。

Guess you like

Origin blog.csdn.net/JMW1407/article/details/119806778