Retrofit的嵌套请求和适配器
Retrofit中的嵌套请求
在实际开发中,可能会存在需要先请求A接口,再去请求B接口的情况。比如需要请求获取收藏文章列表,但是需要先登录拿到Cookie才能请求收藏文章列表接口,此时请求就有了先后顺序,使用RxJava 3进行嵌套请求。
Retrofit中的适配器
Retrofit的接口方法返回类型必须是Call,如果能够将Call改为RxJava中的Observable,对于嵌套的情况,就能得到非常方便优雅的解决,这就是适配器的功能,适配器就能够帮助我们转换为其他类型。
嵌套请求:即用户想要获取收藏的文章,就要先登录、再获取。在代码实现就是先进行login登陆,成功后再获取对应信息。
进入wanandroid API开放平台 玩Android 开放API-玩Android - wanandroid.com,使用里面的登录接口为:
https://www.wanandroid.com/user/login 方法:POST 参数: username,password
获取收藏文章接口为:
https://www.wanandroid.com/lg/collect/list/0/json 方法:GET 参数: 页码:拼接在链接中,从0开始。
依赖添加:
-
implementation("com.squareup.retrofit2:adapter-rxjava3:2.9.0")
-
-
implementation("io.reactivex.rxjava3:rxandroid:3.0.0")
第一步:根据Http接口创建Java接口
-
import io.reactivex.rxjava3.core.Flowable;
-
import okhttp3.ResponseBody;
-
import retrofit2.http.Field;
-
import retrofit2.http.FormUrlEncoded;
-
import retrofit2.http.GET;
-
import retrofit2.http.POST;
-
import retrofit2.http.Path;
-
-
public interface WanAndroidService2 {
-
//登录
-
-
-
Flowable<BaseResponse> login2(; String username, String pwd)
-
-
//获取收藏文章列表
-
-
Flowable<ResponseBody>getArticle(int pageNum);
-
-
}
第二步:配置RxJava适配器,嵌套请求
-
Retrofit retrofit=new Retrofit.Builder()
-
.baseUrl("https://www.wanandroid.com")
-
//传递一个okp,才能实现cookie
-
.callFactory((Call.Factory) new OkHttpClient.Builder()
-
.build())
-
.addConverterFactory(GsonConverterFactory.create())//添加转换器
-
.addCallAdapterFactory(RxJava3CallAdapterFactory.create()) //添加适配器
-
.build();
-
WanAndroidService2 wanAndroidService2=retrofit.create(WanAndroidService2.class);
-
-
-
public void rxjavaTest() {
-
//发送登录请求
-
wanAndroidService2.login2("dll", "dl666666")
-
//根据login2继续生成一个Publisher,Publisher返回一个请求文章列表
-
.flatMap(new Function<BaseResponse, Publisher<ResponseBody>>() {
-
-
public Publisher<ResponseBody> apply(BaseResponse baseResponse) throws Throwable {
-
System.out.println(baseResponse.toString());
-
return wanAndroidService2.getArticle(0);//请求获取收藏文章列表
-
}
-
})
-
//网络请求切换到一个单独的子线程
-
.observeOn(Schedulers.io())
-
//Schedulers.newThread:总是启用新线程,并在新线程执行操作
-
//在Android中则改为在Android主线程:.subscribeOn(AndroidSchedulers.mainThread())
-
.subscribeOn(Schedulers.newThread())
-
//返回结果的回调
-
.subscribe(new Consumer<ResponseBody>() {//返回值就是ResponseBody
-
-
public void accept(ResponseBody responseBody) throws Throwable {
-
System.out.println(responseBody.string());
-
}
-
});
-
while (true){}//先让他阻塞,不然jvm就会退出
-
-
}
第三步:配置Cookie(获取收藏文章列表之前必须登录,我们这里把登录信息缓存在本地内存中)
-
//构建一个map对象,把请求存储在缓存中
-
Map<String, List<Cookie>> cookies=new HashMap<>();
-
-
Retrofit retrofit=new Retrofit.Builder()
-
.baseUrl("https://www.wanandroid.com")
-
//传递一个okp,才能实现cookie
-
.callFactory((Call.Factory) new OkHttpClient.Builder()
-
.cookieJar(new CookieJar() {
-
//保存的数据
-
-
public void saveFromResponse( { HttpUrl httpUrl, List<Cookie> list)
-
//存入请求的数据
-
cookies.put(httpUrl.host(),list);
-
}
-
//传递请求的接口
-
-
-
public List<Cookie> loadForRequest( { HttpUrl httpUrl)
-
//拿到所有请求的数据
-
List<Cookie> cookies = RetrofitTest2.this.cookies.get(httpUrl.host());
-
return cookies==null?new ArrayList<>() : cookies;
-
}
-
}).build())
-
.addConverterFactory(GsonConverterFactory.create())//添加转换器
-
.addCallAdapterFactory(RxJava3CallAdapterFactory.create()) //添加适配器
-
.build();
-
WanAndroidService2 wanAndroidService2=retrofit.create(WanAndroidService2.class);
-
-
-
-
-
-
public void rxjavaTest() {
-
//发送登录请求
-
wanAndroidService2.login2("dll", "dl666666")
-
//根据login2继续生成一个Publisher,Publisher返回一个请求文章列表
-
.flatMap(new Function<BaseResponse, Publisher<ResponseBody>>() {
-
-
public Publisher<ResponseBody> apply(BaseResponse baseResponse) throws Throwable {
-
System.out.println(baseResponse.toString());
-
return wanAndroidService2.getArticle(0);//请求获取收藏文章列表
-
}
-
})
-
//网络请求切换到一个单独的子线程
-
.observeOn(Schedulers.io())
-
//Schedulers.newThread:总是启用新线程,并在新线程执行操作
-
//在Android中则改为在Android主线程:.subscribeOn(AndroidSchedulers.mainThread())
-
.subscribeOn(Schedulers.newThread())
-
//返回结果的回调
-
.subscribe(new Consumer<ResponseBody>() {//返回值就是ResponseBody
-
-
public void accept(ResponseBody responseBody) throws Throwable {
-
System.out.println(responseBody.string());
-
}
-
});
-
while (true){}//先让他阻塞,不然jvm就会退出
-
-
}
首先用户还是需要保存状态,用cookie来存储状态,用于获取文章时不会出现请登录等问题。 retrofit创建就需要cookie、gson以及适配器配置。
在实际调用就按代码流程,flatMap获取登陆后具体需要的内容,subscribe中的accept就是如何处理获取到的内容。
注意:在java测试环境中subscribeOn(Schedulers.newThread())用新线程,而在安卓开发中需要subscribeOn(AndroidSchedulers.mainThread())
适配器起到的作用是将接口中的方法返回值不限制于call,使其更加灵活。
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhfiibbe
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
excel下划线不显示怎么办
PHP中文网 06-23 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
photoshop蒙版画笔没反应怎么办
PHP中文网 06-24