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的主要内容,如果未能解决你的问题,请参考以下文章