Retrofit嵌套请求与适配器

一、前言:

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){}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/256455.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【web安全】文件包含漏洞详细整理

前言 菜某的笔记总结&#xff0c;如有错误请指正。 本文用的是PHP语言作为案例 文件包含漏洞的概念 开发者使用include&#xff08;&#xff09;等函数&#xff0c;可以把别的文件中的代码引入当前文件中执行&#xff0c;而又没有对用户输入的内容进行充分的过滤&#xff0…

添加新公司代码的配置步骤-Part3

原文地址&#xff1a;配置公司代码 概述 这是讨论创建新公司代码的基本标准配置步骤的第三篇博客。在第 1 部分中&#xff0c;我列出并讨论了企业结构中需要配置的项目。我随后提供了特定 FI 配置的详细信息。在本版本中&#xff0c;我将重点关注 SD 和 MM 模块。以下是这些博…

每日一题:LeetCode-11.盛水最多的容器

每日一题系列&#xff08;day 13&#xff09; 前言&#xff1a; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f308; &#x1f50e…

低代码——“平衡饮食”才是王道

文章目录 一、低代码的概念二、低代码的优点2.1. 高效率与快速开发2.2. 降低技术门槛2.3. 适用于快速迭代与原型开发 三、低代码的缺点3.1. 定制性不足3.2. 深度不足3.3. 可能导致技术债务 四、低代码开发的未来4.1. 深度定制化4.2. 智能化 五、低代码会替代传统编程吗&#xf…

Python Struct 模块:二进制数据的强大解析与打包工具

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com Python中的struct模块是一个强大而灵活的工具&#xff0c;用于解析和打包二进制数据。本文将深入介绍struct模块的各个方面&#xff0c;通过丰富的示例代码&#xff0c;帮助读者更全面地理解和运用这一模块&…

参考信号速度变化存在跳跃时容易发生不稳定的阻抗调节

问题描述 当参考信号速度存在跳跃变化时&#xff0c;阻抗调节系统容易发生不稳定。这是因为阻抗调节系统需要根据参考信号的速度来调整其输出阻抗&#xff0c;以匹配负载阻抗&#xff0c;从而保持系统的稳定性。 当参考信号速度突然变化时&#xff0c;阻抗调节系统可能无法及…

C++新经典模板与泛型编程:用成员函数重载实现is_base_of

用成员函数重载实现is_base_of std::is_base_of是一个C 11标准中用于判断某个类是否是另一个类父类的类模板。 #include "killCmake.h"#include<string>using namespace std;class A { };class B : public A { public:B(int x): x_(x){} private:int x_; };/…

LinuxBasicsForHackers笔记 -- BASH 脚本

你的第一个脚本&#xff1a;“你好&#xff0c;黑客崛起&#xff01;” 首先&#xff0c;您需要告诉操作系统您要为脚本使用哪个解释器。 为此&#xff0c;请输入 shebang&#xff0c;它是井号和感叹号的组合&#xff0c;如下所示&#xff1a;#! 然后&#xff0c;在 shebang …

正则表达式(6):分组与后向引用

正则表达式&#xff08;6&#xff09;&#xff1a;分组与后向引用 总结 本博文转载自 在本博客中&#xff0c;”正则表达式”为一系列文章&#xff0c;如果你想要从头学习怎样在Linux中使用正则&#xff0c;可以参考此系列文章&#xff0c;直达链接如下&#xff1a; 在Linux中…

GateWay网关介绍以及整合knife4j聚合所有服务的接口文档

为什么使用网关&#xff1f; 因为多个微服务的端口不同&#xff0c;前端调用不方便&#xff0c;使用网关可以统一接收处理前端的请求&#xff0c;同时方便接口的集中处理&#xff0c;比如鉴权、聚合接口文档、限流等等.. 这里使用Knife4j文档工具来实现接口文档&#xff1a;K…

Linux 防病毒软件:CentOS有哪些付费的防病毒软件

CentOS是一个基于开源的Linux发行版,通常不像Windows那样普遍需要使用付费的防病毒软件。大多数Linux系统侧重于使用开源和免费的安全工具来保护系统。一些常见的免费和开源的防病毒软件和安全工具包括ClamAV、Sophos Antivirus for Linux、rkhunter、chkrootkit等。 如果你非…

VMware提示:此虚拟机似乎正在使用中,取得该虚拟机的所有权失败错误的解决方案

当你遇到这个的时候是不是很疑惑&#xff0c;现在给你解决方案 step1: 先找到配置文件目录 D:\centOs7_mini\ 这里写成你的这个 step2: 在这个地方查找最后面是 .vmx.lck文件夹,然后进行修改、删除、移动都可以 step3: 去虚拟机那边重新启动就行