Android :Retrofit嵌套请求及适配器应用
Posted JMW1407
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android :Retrofit嵌套请求及适配器应用相关的知识,希望对你有一定的参考价值。
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,使其更加灵活。
以上是关于Android :Retrofit嵌套请求及适配器应用的主要内容,如果未能解决你的问题,请参考以下文章