Retrofit嵌套请求与适配器

一、前言:

1.        retrofit嵌套请求

在实际开发中,可能会存在:需要先请求A接口,在请求B接口的情况,比如进入“玩android”网页请求获取收藏文章列表,但是需要先登录拿到Cookie才能请求搜藏文章几口,此时请求就有了先后顺序,为了完成该功能,我们需要这样实现代码。

Retrofit嵌套请求与适配器_第1张图片

代码显得就很冗杂。

2.Retrofit适配器

Retrofit的接口返回的方法必须是Call,如果能够将Call改为RxJava的Observable。对于嵌套而言就得到了非常方便的解决,这就是适配器的功能。如果我们想要返回的不是Call适配器就能帮助我们转换为其他类型。

3.添加依赖:

    implementation 'com.squareup.retrofit2:adapter-rxjava3:2.9.0'

如果是Android开发还需要引入

    implementation 'io.reactivex.rxjava3:rxandroid:3.0.0'

二、代码实现

1.创建接口类对象

public interface WanAndroidService2 {

    /**
     * 学习Retrofit嵌套请求与适配器
     * 登录接口
     * @param username
     * @param pwd
     * @return
     */
    @POST("user/login")
    @FormUrlEncoded
    Flowable login2(@Field("username") String username, @Field("password") String pwd);



    /**
     * 学习Retrofit嵌套请求与适配器
     * 获取收藏文章列表
     * @return
     */
    @GET("lg/collect/list/{pageNum}/json")
    Flowable getArticle(@Path("pageNum") int pageNum);
}

2.代码实现

public class WanAndroidUnitTest {


    /**
     * 学习Retrofit嵌套请求与适配器
     */
    Map> cookies = new HashMap<>();//全局变量接收cookie

    Retrofit retrofit3 = new Retrofit.Builder()
            .baseUrl("https://www.wanandroid.com/")
            .callFactory((okhttp3.Call.Factory) new OkHttpClient.Builder()
                    .cookieJar(new CookieJar() {
                        @Override
                        public void saveFromResponse(@NonNull HttpUrl httpUrl, @NonNull List list) {
                            cookies.put(httpUrl.host(),list);
                        }

                        @NonNull
                        @Override
                        public List loadForRequest(@NonNull HttpUrl httpUrl) {
                            List cookies = WanAndroidUnitTest.this.cookies.get(httpUrl.host());
                            return cookies == null ? new ArrayList<>() :cookies;
                        }
                    }).build())
            .addConverterFactory(GsonConverterFactory.create())//添加转换器
            .addCallAdapterFactory(RxJava3CallAdapterFactory.create())//添加适配器
            .build();//创建retrofit对象
    WanAndroidService2 wanAndroidService3 = retrofit3.create(WanAndroidService2.class);//创建接口类对象,并且设置为全局变量。

    @Test
    public void rxjavaText(){
        //切换线程,如果是android请求的话必须把网络请求切换到一个子线程
        //把观察的回调切换到android的主线程,现在在java环境中。如果是在android环境中就需要把subscribeOn(Schedulers.newThread())换成.subscribeOn(AndroidSchedulers.mainThread())  。使得我们接口的回调是在主线程              .subscribeOn(AndroidSchedulers.mainThread())
        wanAndroidService3.login2("Anglin","rssqzqyp")
                .flatMap(new Function>() {
                    @Override
                    public Publisher apply(BaseResponse baseResponse) throws Throwable {
                        return wanAndroidService3.getArticle(0);
                    }
                })
                .observeOn(Schedulers.io())
                .subscribeOn(AndroidSchedulers.mainThread())
                .subscribe(new Consumer() {
                    @Override
                    public void accept(ResponseBody responseBody) throws Throwable {
                        System.out.println(responseBody.string());
                    }
                });
        while (true){}
    }
}

你可能感兴趣的:(Android,retrofit)