不同网络请求框架之间的对比

easyhttp、retrofit与okgo的对比

|--------------|-----------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------|
| 功能或细节 | EasyHttp | Retrofit | OkGo |
| 对应版本 | 12.2 | 2.9.0 | 3.0.4 |
| issues 数 | | | |
| aar 包大小 | 90 KB | 123 KB | 131 KB |
| minSdk 要求 | API 14+ | API 21+ | API 14+ |
| 配置多域名 | ✅ | ❌ | ✅ |
| 动态 Host | ✅ | ❌ | ❌ |
| 全局参数 | ✅ | ❌ | ✅ |
| 日志打印 | ✅ | ❌ | ✅ |
| 超时重试 | ✅ | ✅ | ✅ |
| 请求缓存 | ✅ | ❌ | ✅ |
| 下载校验 | ✅ | ❌ | ❌ |
| 极速下载 | ✅ | ❌ | ❌ |
| 上传进度监听 | ✅ | ❌ | ✅ |
| Json 参数提交 | ✅ | ❌ | ✅ |
| Json 日志打印格式化 | ✅ | ❌ | ❌ |
| 请求代码定位 | ✅ | ❌ | ❌ |
| 延迟发起请求 | ✅ | ❌ | ❌ |
| 分区存储适配 | ✅ | ❌ | ❌ |
| 上传文件类型 | File / FileContentResolver InputStream / RequestBody | RequestBody | File |
| 批量上传文件 | ✅ | ❌ | ✅ |
| 请求生命周期 | 自动管控 | 需要封装 | 需要封装 |
| 参数传值方式 | 字段名 + 字段值 | 参数名 + 参数值 | 定义 Key + Value |
| 框架灵活性 | 高 | 低 | 中 |
| 框架学习成本 | 中 | 高 | 低 |
| API 记忆成本 | 低 | 高 | 低 |
| 接口维护成本 | 低 | 中 | 高 |
| 框架维护状态 | 维护中 | 维护中 | 停止维护 |

  • Retrofit 在我看来并不是那么好用,因为很多常用的功能实现起来比较麻烦,动态 Host 要写拦截器,日志打印要写拦截器,就连最常用的添加全局参数也要写拦截器,一个拦截器意味着要写很多代码,如果写得不够严谨还有可能出现 Bug,从而影响整个 OkHttp 请求流程,我经常在想这些功能能不能都用一句代码搞定,因为我觉得这些功能是设计框架的时候本应该考虑的,这便是我做这个框架的初心。
  • OkGo 其实也存在一些弊端,例如会把参数的 key 引用放到外层去,这样会引发一些问题:
    1. Key 管理问题:这个 key 可能会在外层被使用很多次,这样参数的 key 管理就会变得不可控,后续接口改动可能会出现漏改的风险,尽管这种情况比较少见,但是也不容忽视,而 EasyHttp 没有这个问题,因为 EasyHttp 不会将参数 key 值放置到外层中去。
    2. 接口参数注释的问题:站在代码的规范角度上讲,我们应该在代码中注明参数的含义及作用,如果一旦将 key 放到外层,那么每一处调用的地方都需要写一遍注释,而 EasyHttp 是将参数字段化,只需要写一次注释到字段上即可。
    3. 接口信息完整信息展示:使用 OkGo 请求网络,只能在调用的地方看到传递的接口参数,而一些被其他地方引用的参数,我们无法很直观的看到,只能通过追踪代码或者查看文档来得知,而 EasyHttp 将一个接口的信息全部通过一个类来管理的,这个类其实就相当于一个接口文档。
    4. 接口的动态化配置:除了接口的参数之外,一个接口还有可能单独配置 OkHttpClient 对象、参数的提交方式、接口响应处理方式等,这些用 OkGo 是可以实现,但是每个地方都要写一次,而 EasyHttp 可以直接在 API 类中配置,真正做到一劳永逸。
  • EasyHttp 采用了 OOP 思想,一个请求代表一个对象,通过类继承和实现的特性来对接口进行动态化配置,几乎涵盖接口开发中所有的功能,使用起来非常简单灵活。而 Retrofit 采用的是注解方式,缺点是灵活性极低,因为注解上面只能放常量,也就会限定你在注解上面的一切参数只能是事先定义好的,这对接口的动态化配置极不利的。

  • 有很多人觉得写一个接口类很麻烦,关于这个问题我后面已经想到一个好方案了,大家可以将 Api 类和 Bean 类写在一起,这样大家就不需要多写一个类了,具体写法示例如下:

    public final class XxxApi implements IRequestApi {

    复制代码
      @Override
      public String getApi() {
          return "xxx/xxx";
      }
    
      private int xxx;
    
      public XxxApi setXxx(int xxx) {
          this.xxx = xxx;
          return this;
      }
    
      ......
    
      public final static class Bean {
    
          private int xyz;
    
          public int getXyz() {
              return xyz;
          }
    
          ......
      }

    }

  • 是不是很机智?这样不仅很好地解决了这一问题,还能将一个接口所有的信息都包裹在这个类中,非常直观,一览如云,妥妥的一箭双雕。

相关推荐
折哥的程序人生 · 物流技术专研5 小时前
Java面试85题图解版 · 特别篇:2026后端高频面试题复盘(算法底层逻辑+高并发架构设计全解析,附Java实战代码)
java·网络·数据库·算法·面试
专注VB编程开发20年5 小时前
c#Modbus上位机开发-一次读10个地址和100个地址速度一样
网络·网络协议·tcp/ip
2601_961963388 小时前
技术解剖:哈希值、区块链与CA认证如何守护电子合同安全?
网络·人工智能·安全·区块链·智能合约·政务
2601_961963388 小时前
从“电子化”到“自动化”:2026年智能合约与电子合同融合的技术逻辑与法律适配
网络·人工智能·区块链·智能合约·政务
不吃土豆的马铃薯9 小时前
C++ 高性能网络缓冲区 Buffer 源码解析
linux·服务器·开发语言·网络·c++
dog25010 小时前
网络可用性,扩展性,性能的统计本质
网络
嵌入式-老费10 小时前
esp32开发与应用(再谈wifi的使用)
网络·智能路由器
YJlio10 小时前
《Sysinternals实战指南》16.5 Ctrl2Cap 工具详解:把 Caps Lock 变成 Ctrl 的键盘改造与回退方法
linux·运维·服务器·网络·python·学习·计算机外设
wangxixi52211 小时前
OTN 以太网业务接入全流程详解
网络
带土111 小时前
5. 网络体系架构与WireShark简单使用
网络·测试工具·wireshark