从 OkHttp 到 Retrofit 再到 OkHttps

如今在 Android 原生领域,OkHttp 早已一统江湖,然而在项目中直接用 OkHttp 做网络请求又不够简单,这时我们会找基于 OkHttp 的二次封装框架。

Retrofit 已经风靡一时,它的出现,确实简化了 OkHttp 的使用过程,可它也有自己的问题:

  1. 带来了过多的概念和一大推的注解
  2. 在处理文件上传下载和进度监听时不够简单
  3. 缺少全局回调监听机制,在统一处理接口的错误码时还需要再次封装
  4. 请求发出前异步处理操作困难

终于,OkHttps 的出现,让这一切变得更加的简单和优雅,一个简单的示例:

// 构建 HTTP
HTTP http = HTTP.builder()
        .baseUrl("https://api.demo.com")
        .build();

// 同步请求
List<User> users = http.sync("/users")  // http://api.demo.com/users
        .get()                          // GET请求
        .getBody()                      // 获取响应报文体
        .toList(User.class);            // 得到目标数据 

// 异步请求
http.async("/users/jack")               //  http://api.demo.com/users/jack
        .setOnResponse((HttpResult result) -> {
            // 得到目标数据
            User jack = result.getBody().toBean(User.class);
        })
        .get();                         // GET请求

OkHttps 的优点:

1、超级轻量

直接依赖 OkHttp,自身体积只有 Retrofit 的一半

2、语义化 API

同步就是 sync,异步就是 async,GET 请求就用 get(),POST 请求就用 post()

http.async("/aouth/signin")   // 异步请求
        .addJsonParam("username", "jack")
        .addJsonParam("password", "xxxx")
        .post();              // POST 请求

3、无需定义接口

因为一切本身就很简单,没有动态代理,性能更好

// 这么简单的一个请求,真的需要定义接口吗?
List<User> users = http.sync("/users/{userId}")  // http://api.demo.com/users/1
        .addPathParam("userId", 1)
        .get()                          // GET请求
        .getBody()                      // 获取响应报文体
        .toList(User.class);            // 得到目标数据 

4、上传一个文件

http.sync("/upload")
        .addFileParam("test", "D:/download/test.zip")
        .post();

5、监听上传进度

http.sync("/upload")
        .addFileParam("test", "D:/download/test.zip")
        .setOnProcess((Process process) -> {           // 上传进度回调
            long doneBytes = process.getDoneBytes();   // 已发送字节数
            long totalBytes = process.getTotalBytes(); // 总共的字节数
            double rate = process.getRate();           // 已发送的比例
            boolean isDone = process.isDone();         // 是否发送完成
        })
        .post();

6、下载一个文件

http.sync("/download/xxx.zip")
        .get()                          // 使用 GET 方法(其它方法也可以,看服务器支持)
        .getBody()                      // 得到报文体
        .toFile("D:/download/xxx.zip")  // 下载到指定的路径
        .start();                       // 启动下载

7、监听下载进度

http.sync("/download/test.zip")
        .get().getBody()  
        .setOnProcess((Process process) -> { // 下载进度回调
             // 和上传进度回调一模一样
        })
        .toFolder("D:/download/")            // 指定下载的目录
        .start();

8、控制下载过程

Ctrl ctrl = http.sync("/download/test.zip")
        .get().getBody()  
        .toFolder("D:/download/")            // 指定下载的目录
        .start();

ctrl.status();      // 状态
ctrl.pause();       // 暂停
ctrl.resume();      // 恢复
ctrl.cancel();      // 取消(同时会删除文件,不可恢复)

9、全局回调处理

三种全局回调处理,同时还有回调阻断功能

HTTP http = HTTP.builder()
        .responseListener((HttpTask<?> task, HttpResult result) -> {
            // 所有请求响应后都会走这里

            return true; // 返回 true 表示继续执行 task 的 OnResponse 回调,false 表示不再执行
        })
        .completeListener((HttpTask<?> task, State state) -> {
            // 所有请求执行完都会走这里

            return true; // 返回 true 表示继续执行 task 的 OnComplete 回调,false 表示不再执行
        })
        .exceptionListener((HttpTask<?> task, IOException error) -> {
            // 所有请求发生异常都会走这里

            return true; // 返回 true 表示继续执行 task 的 OnException 回调,false 表示不再执行
        })
        .build();

10、统一异步处理

该功能主要为了弥补拦截器的不足,拦截器内只能同步处理

HTTP http = HTTP.builder()
        .addPreprocessor((PreChain chain) -> {
            HttpTask<?> task = chain.getTask();// 获得当前的HTTP任务
            if (!task.isTagged("Auth")) {      // 根据标签判断该任务是否需要Token
                return;
            }
            requestToken((String token) -> {   // 异步获取 Token
                task.addHeader("Token", token);// 为任务添加头信息
                chain.proceed();               // 继续当前的任务
            });
        })
        .build();

OkHttps 还有其它很多其它实用的功能
大家可有到它的中文网站去看哦:https://okhttps.ejlchina.com

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值