Retrofit+OKHttp+RxAndroid,图文最详细解释(Kotlin)

2023-11-07

文章目录

众所周知,目前市面上最流行的网络请求的方式莫过于Retrofit+OkHttp+RxJava.
首先我们要知道每个框架的作用:
Retrofit: Retrofit 仅负责 网络请求接口的封装
OkHttp:负责请求的过程
RxJava: 负责异步,各种线程之间的切换。
下面我们逐一介绍各个框架的使用,以及组合起来的使用:

一、Retrofit

流程图如下:
在这里插入图片描述

1、上图说明了如下几点:

  1. App应用程序通过 Retrofit 请求网络,实际上是使用 Retrofit 接口层封装请求参数、Header、Url 等信息,之后由 OkHttp 完成后续的请求操作。
  2. 在服务端返回数据之后,OkHttp 将原始的结果交给 Retrofit,Retrofit根据用户的需求对结果进行解析。所以网络请求的本质仍旧是OkHttp完成的,retrofit只是帮使用者来进行工作简化的,比如配置网络,理数据等工作,提高这一系列操作的复用性。这也就是网上流行的一个不太准确的总结:okhttp是瑞士军刀,retrofit则是将这把瑞士军刀包装成了一个非常好用的指甲钳。

2、Retrofit 对Okhttp做了什么?

Retrofit并没有改变网络请求的本质,也无需改变,因为Okhttp已经足够强大,Retrofit的封装可以说是很强大,里面涉及到一堆的设计模式,可以通过注解直接配置请求,可以使用不同的http客户端,虽然默认是用http ,可以使用不同Json Converter 来序列化数据,同时提供对RxJava的支持,使用Retrofit + OkHttp + RxJava 可以说是目前比较
潮的一套框架,但是需要有比较高的门槛。

3、下面我们来看一下Retrofit的具体使用:

1、导入依赖: module/build.gradle下
dependencies {
   
    // Retrofit库
    compile 'com.squareup.retrofit2:retrofit:2.0.2'
    // Okhttp库
    compile 'com.squareup.okhttp3:okhttp:3.1.2'
    
  }
2、添加网络权限:\src\main\AndroidManifest.xml
<uses-permission android:name="android.permission.INTERNET"/>
3、创建用于描述网络请求的接口

Retrofit将Http请求抽象成java接口:采用注解描述网络请求和配置网络请求参数。
1.用动态代理 动态 将该接口的注解“翻译”成一个 Http 请求,最后再执行 Http 请求
2.接口中的每个方法的参数都需要使用注解标注,否则会报错
注解类型:
2.1.网络请求方法:@GET 、@POST 、@PUT、 @DELETE、 @PATH 、@HEAD 、@OPTIONS 、@HTTP
2.2.标记类:@FormUrlEncoded、 @Multipart 、@Streaming
2.3.网络请求参数:@Header 、@hraders 、@URL、 @Body、 @Path 、@Field、 @FieldMap 、@Part 、@PartMap 、@Query 、@QueryMap

3.1、网络请求方法

在这里插入图片描述
@GET、@POST、@PUT、@DELETE、@HEAD
以上方法分别对应 HTTP中的网络请求方式:Retrofit把网络请求的URL分成了两部分
第一部分:在网络请求接口的注解设置

    @GET("openapi.do?name=jack&pwd=123456")
    fun login() : Call<Reception>
  //@GET注解的作用:采用Get方法发送网络请求
  //getCall() = 接收网络请求数据的方法
  //其中返回类型为Call<*>,*是接收数据的类(此类可以自定义)

第二部分:在创建Retrofit实例时通过.baseUrl()设置

 Retrofit.Builder()
            .baseUrl("https://guz.retroft.com/")
            .addConverterFactory(GsonConverterFactory.create())//设置数据解析器
            .build()
// 从上面看出:一个请求的URL可以通过 替换块 和 请求方法的参数 来进行动态的URL更新。
// 替换块是由 被{}包裹起来的字符串构成
// 即:Retrofit支持动态改变网络请求根目录

网络请求的完整Url = 在创建Retrofit实例时通过baseUrl设置 + 3网络请求接口的注解设置

在这里插入图片描述
@HTTP
作用:替换@GET、@POST、@PUT、@DELETE、@HEAD注解及更多功能的拓展。
具体使用:通过属性method,path,hasBody进行设置。

    /**
     * method:网络请求的方法(区分大小写)
     * path:网络请求地址路径
     * hasBody:是否有请求体
     */
    @HTTP(method = "GET", path = "blog/{id}", hasBody = false)
    Call<ResponseBody> getCall(@Path("id") int id);
    // {id} 表示是一个变量
    // method 的值 retrofit 不会做处理,所以要自行保证准确
3.2、标记

在这里插入图片描述
a. @FromUrlEncoded
发送form-encoded的数据,每个键值对需要用@Filed来注解键名,随后的对象需要提供值。
b.@Multipart
发送form-encoded的数据(适用于有文件上传的场景),每个键值对需要用@Part来注解键名,随后的对象需要提供值。
具体使用:

public interface GetRequest_Interface {
   
        /**
         *表明是一个表单格式的请求(Content-Type:application/x-www-form-urlencoded)
         * <code>Field("username")</code> 表示将后面的 <code>String name</code> 中name的取值作为 username 的值
         */
        @POST("/form")
        @FormUrlEncoded
        Call<ResponseBody> testFormUrlEncoded1(@Field("username") String name, @Field("age") int age);
         
        /**
         * {@link Part} 后面支持三种类型,{@link RequestBody}、{@link okhttp3.MultipartBody.Part} 、任意类型
         * 除 {@link okhttp3.MultipartBody.Part} 以外,其它类型都必须带上表单字段({@link okhttp3.MultipartBody.Part} 中已经包含了表单字段的信息),
         */
        @POST("/form")
        @Multipart
        Call<ResponseBody> testFileUpload1(@Part("name") RequestBody name, @Part("age") RequestBody age, @Part MultipartBody.Part file);

}

// 具体使用
       GetRequest_Interface service = retrofit.create(GetRequest_Interface.class);
        // @FormUrlEncoded 
        Call<ResponseBody> call1 = service.testFormUrlEncoded1("Carson", 24);
        
        //  @Multipart
        RequestBody name = RequestBody.create(textType, "Carson");
        RequestBody age = RequestBody.create(textType, "24");

        MultipartBody.Part filePart = MultipartBody.Part.createFormData("file", "test.txt", file);
        Call<ResponseBody> call3 = service.testFileUpload1(name, age, filePart);
3.3、网络请求参数

在这里插入图片描述
a. @Headers
作用:添加请求头 &添加不固定的请求头

//@Header
@GET("user")
Call<user> getUser(@Header("Authorization") String authorization)

// @Headers
@Headers("Authorization: authorization")
@GET("user")
Call<User> getUser()

b.@Body
作用:以 Post方式 传递 自定义数据类型 给服务器
特别注意:如果提交的是一个Map,那么作用相当于 @Field
不过Map要经过 FormBody.Builder 类处理成为符合 Okhttp 格式的表单,如:

FormBody.Builder builder = new FormBody.Builder();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Retrofit+OKHttp+RxAndroid,图文最详细解释(Kotlin) 的相关文章

随机推荐

  • vmware中centos7启动出现Internal error xfs XFS_WANT_CORRUPTED_GOTO错误

    vmware中centos出现 sda Assuming drive cache write through Internal error xfs XFS WANT CORRUPTED GOTO at line 1692 of file f
  • 怎么写一篇技术笔记

    为什么要写笔记 为什么做笔记 从我们开始上学开始就开始做各种不同笔记 好记性不如烂笔头 做笔记的第一个目的好像就是为了抵抗遗忘 根据艾宾浩斯遗忘曲线 记忆是不断的流逝 只有不定时去补偿记忆 才能能够减缓遗忘的速度 做笔记也是一个对知识点的一
  • RandomAccessFile使用小结

    本文是基于Linux环境运行 读者阅读前需要具备一定Linux知识 RandomAccessFile是Java输入 输出流体系中功能最丰富的文件内容访问类 既可以读取文件内容 也可以向文件输出数据 与普通的输入 输出流不同的是 Random
  • Knife4j 基础(OpenAPI3+SpringBoot2.7)

    1 Knife4j基础 OpenAPI3 SpringBoot2 7 本文按照官方文档 在 SpringBoot 2 7 项目中 集成 Knife4j 的 OpenAPI3 版本 2 官网 Knife4j官网 Knife4j在实现OpenA
  • adb shell后,getevent退出方法

    adb shell后 getevent退出方法 输入 exit 然后回车退出
  • ubuntu 下安装微软字体和 console

    https www cnblogs com feipeng8848 p 9649089 html 转载于 https www cnblogs com zach0812 p 11514680 html
  • SJTU简单路径数目

    Description 大家还记得邻接表类吗 没错 邻接表是表示稀疏图 边数比较少的图 的一种很好的数据结构 现在 我们要求使用深度优先遍历的思想 利用邻接表类 对给定的有向图 找出从指定结点start出发 长度为M的所有简单路径 简单路径
  • 超详细的卷积后大小的计算公式

    计算公式定义 定义几个参数 输入图片大小 W W 卷积核大小 F F 步长 S padding的像素数 P 于是我们可以得出计算公式为 N W F 2P S 1 输出图片大小为 N N 以resnet50为例 输入为 1 3 224 224
  • 手机耳机怎么在电脑上说话_手机耳机怎样当做电脑麦克风?

    首先 这篇文章讲的是有绿粉两个颜色的耳机 麦克接口的电脑 方法一 某宝9 9一条耳机一分二分线器进行解决 注意默认录音设备是否设置对了 方法二 玄学声卡 某些电脑的自带声卡很神奇 可以玄学逆转电流 就比如我家电脑 只要把手机耳机 单线耳机
  • Hive启动报错(个人遇到问题&解决方法)

    hive执行sql报错 FAILED SemanticException org apache hadoop hive ql metadata HiveException java lang RuntimeException Unable
  • C++ 代码换行

    1 字符串太长 换行显示 怎么办 2 使用反斜杠 如下 string str abcd 1234 注意 反斜杠后面不准有任何字符 下一行开头的制表符不包含在整个字符串中 但是下一行开头的空格符包含在整个字符串中 3 使用双引号 如下 str
  • 浅谈关于QT中Webkit内核浏览器

    关于QT中Webkit内核浏览器是本文要介绍的内容 主要是来学习QT中webkit中浏览器的使用 提起WebKit 大家自然而然地想到浏览器 作为浏览器内部的主要构件 WebKit的主要工作是渲染 给定一个HTML文件 WebKit的工作是
  • linux设备管理之设备号与次设备号

    linux设备管理之主设备号与次设备号 jinzi 博客园 剽窃 过来的 记录下 以备查 主设备号和次设备号 一个字符设备或者块设备都有一个主设备号和次设备号 主设备号和次设备号统称为设备号 主设备号用来表示一个特定的驱动程序 次设备号用来
  • 使用 Python 对股票数据分析预测

    使用 Python 对股票数据分析预测 文章目录 使用 Python 对股票数据分析预测 目录索引 模块安装 股票数据获取 雅虎财经 Quandl 模块 Pandas Datareader 模块 数据预处理 缺失值查找 数据规范化 股价涨跌
  • 前端埋点VS后端埋点

    前端埋点比后端埋点更灵活 比如页面停留时间 点击下拉框动作等都可以通过埋点接口让后端记录下来 而后端埋点 这些是记录不下来的 因为没有请求 后端埋点还有一个问题 有可能前端不同按钮调用后端同一个接口 此时后端埋点是区分不出来的 后端埋点又分
  • 代码习惯

    补个liangs333的代码习惯 include
  • 全面 Serverless 化,阿里云微服务引擎 MSE 重磅升级

    微服务已成为企业数字化首选的应用架构 并正在向缩短服务的构建周期和降低资源成本 提升架构质量和架构效率两个方向演进 今天 阿里云正式宣布微服务引擎 MSE 重磅升级 全面 Serverless 化 带来两大新形态和两大新体验 产业新形态 业
  • [Android AIDL系列 1] 手动编译aidl文件,生成Java、C++[android]、C++[ndk]、Rust接口

    AIDL文件在Android系统上应用广泛 和底层的Binder机制紧密关联 在Android源码或者Android Studio中通常是自动编译aidl文件 生成对应语言的接口文件 做应用层Java开发 aidl和binder封装的比较
  • centos7虚拟网卡其他服务器不识别,Vmware10 下安装centos7,网卡无法识别问题处理...

    问题表现 之前安装的是32位版本的centos5 后来操作不当损坏 于是安装了64位版本的centos7 安装后网卡无法识别 用如下第一种方式顺利解决 网络连接使用nat方式 由于Vmware虚拟网卡和linux兼容问题导致驱动无法正常安装
  • Retrofit+OKHttp+RxAndroid,图文最详细解释(Kotlin)

    文章目录 一 Retrofit 1 上图说明了如下几点 2 Retrofit 对Okhttp做了什么 3 下面我们来看一下Retrofit的具体使用 1 导入依赖 module build gradle下 2 添加网络权限 src main