一、前言:
1. retrofit嵌套请求
在实际开发中,可能会存在:需要先请求A接口,在请求B接口的情况,比如进入“玩android”网页请求获取收藏文章列表,但是需要先登录拿到Cookie才能请求搜藏文章几口,此时请求就有了先后顺序,为了完成该功能,我们需要这样实现代码。
代码显得就很冗杂。
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")@FormUrlEncodedFlowable<BaseResponse> login2(@Field("username") String username, @Field("password") String pwd);/*** 学习Retrofit嵌套请求与适配器* 获取收藏文章列表* @return*/@GET("lg/collect/list/{pageNum}/json")Flowable<ResponseBody> getArticle(@Path("pageNum") int pageNum);
}
2.代码实现
public class WanAndroidUnitTest {/*** 学习Retrofit嵌套请求与适配器*/Map<String,List<Cookie>> cookies = new HashMap<>();//全局变量接收cookieRetrofit retrofit3 = new Retrofit.Builder().baseUrl("https://www.wanandroid.com/").callFactory((okhttp3.Call.Factory) new OkHttpClient.Builder().cookieJar(new CookieJar() {@Overridepublic void saveFromResponse(@NonNull HttpUrl httpUrl, @NonNull List<Cookie> list) {cookies.put(httpUrl.host(),list);}@NonNull@Overridepublic List<Cookie> loadForRequest(@NonNull 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();//创建retrofit对象WanAndroidService2 wanAndroidService3 = retrofit3.create(WanAndroidService2.class);//创建接口类对象,并且设置为全局变量。@Testpublic void rxjavaText(){//切换线程,如果是android请求的话必须把网络请求切换到一个子线程//把观察的回调切换到android的主线程,现在在java环境中。如果是在android环境中就需要把subscribeOn(Schedulers.newThread())换成.subscribeOn(AndroidSchedulers.mainThread()) 。使得我们接口的回调是在主线程 .subscribeOn(AndroidSchedulers.mainThread())wanAndroidService3.login2("Anglin","rssqzqyp").flatMap(new Function<BaseResponse, Publisher<ResponseBody>>() {@Overridepublic Publisher<ResponseBody> apply(BaseResponse baseResponse) throws Throwable {return wanAndroidService3.getArticle(0);}}).observeOn(Schedulers.io()).subscribeOn(AndroidSchedulers.mainThread()).subscribe(new Consumer<ResponseBody>() {@Overridepublic void accept(ResponseBody responseBody) throws Throwable {System.out.println(responseBody.string());}});while (true){}}
}