一、前言:
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")
@FormUrlEncoded
Flowable<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<>();//全局变量接收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<Cookie> list) {
cookies.put(httpUrl.host(),list);
}
@NonNull
@Override
public 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);//创建接口类对象,并且设置为全局变量。
@Test
public 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>>() {
@Override
public Publisher<ResponseBody> apply(BaseResponse baseResponse) throws Throwable {
return wanAndroidService3.getArticle(0);
}
})
.observeOn(Schedulers.io())
.subscribeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<ResponseBody>() {
@Override
public void accept(ResponseBody responseBody) throws Throwable {
System.out.println(responseBody.string());
}
});
while (true){}
}
}