OkHttp系列之入门篇

0x00 概述

OkHttp是一个轻量级的http网络请求开源框架,由Square公司开源,该公司也开源了其他项目,有兴趣的童鞋可以去Github-Square上去了解下其他相关开源项目。

OkHtttp是Android/Java应用的Http,HTTP/2客户端。使用OkHttp可以高效的发起HTTP请求,并节省带宽等资源,具体会在进阶篇中通过代码详解。

OkHttp由以下几方面优势,以至于Android系统已经将其集成作为HTTP框架使用。

  • 允许对同一个主机的HTTP2请求共享一个socket链接
  • 使用链接池来降低请求延迟
  • 自动使用GZIP进行压缩
  • 使用响应缓存来避免重复请求

除了以上官方所列出的之外,基本上支持各种需求。

0x10 引入

gradle

compile 'com.squareup.okhttp3:okhttp:3.8.1'

maven

<dependency>
  <groupId>com.squareup.okhttp3</groupId>
  <artifactId>okhttp</artifactId>
  <version>3.8.1</version>
</dependency>

jar

下载jar包,地址:download okhttpjar

0x20 使用

OkHttp框架对整个请求的流程进行了抽象和封装,首先HTTP作为响应式应答,请求端抽象为客户端(OkHttpClient),然后每个请求抽象为一个Call,通过Request去构造一个Call,然后把call丢给OkHttp,根据Response做相应处理,就这么简单。
接下来看具体的请求类型:

0x21 Get

// 首先创建一个OkHttpClient来处理请求,可以通过Builder自定义Client.
OkHttpClient client = new OkHttpClient();

// 同步方式发起请求,并获取响应
String run(String url) throws IOException {
  Request request = new Request.Builder()
      .url(url)
      .build();

  Response response = client.newCall(request).execute();
  return response.body().string();
}

对,没错就这么简单,当然具体在业务中,肯定不是这样的使用方式,比如说:

    /**
     * 根据数据类型进行分装,统一处理
     * @param url URL
     * @return {@link APIResult}
     */
    public static APIResult<JSONObject> doGet(String url) {
        Request request = new Request.Builder().url(url).build();
        try {
            try (Response response = mInstance.newCall(request).execute()) {
                if (response.isSuccessful()) {
                    String responseText = response.body().string();
                    Log.d(TAG, "doOkHttpRequest: response = " + responseText);
                    JSONObject jsonObject = new JSONObject(responseText);
                    return new APIResult<> (
                            OkHttpConstants.HTTP_REQUEST_RETURN_CODE_SUCCESS,
                            OkHttpConstants.HTTP_REQUESET_SUCCESS_ERROR_MESSAGE,
                            jsonObject);
                }
            } catch (JSONException e) {
                e.printStackTrace();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

在使用以上方式时,在Android中必须单独开启一个线程进行处理,OkHttp也提供了异步回调的方式,大大节省编码工作

    /**
     * 通过回调方式获取响应内容
     * @param url URL
     * @param responseCallback Response Callback
     */
    public static void doGet(String url, Callback responseCallback) {
        Request request = new Request.Builder().url(url).build();
        mInstance.newCall(request).enqueue(responseCallback);
    }

当然如果要近一步封装的话,可以对Callback进行一些封装和处理。

0x22 Post

public static final MediaType JSON
    = MediaType.parse("application/json; charset=utf-8");

OkHttpClient client = new OkHttpClient();

String post(String url, String json) throws IOException {
  RequestBody body = RequestBody.create(JSON, json);
  Request request = new Request.Builder()
      .url(url)
      .post(body)
      .build();
  Response response = client.newCall(request).execute();
  return response.body().string();
}

和Get请求的区别就是,在构造Request时需要RequestBody丢进去,其他都是一样的,使用了Builder设计模式大大简化代码,也便于使用和理解。

其他请求方法就不过多介绍,有兴趣可以自己写下代码。
关于更多HTTP Method GO

0x30 总结

使用OkHttp三步走

  1. 创建OkHttpClient对象:new OkHttpClient()
  2. 创建Request对象:new Request.Builder().url(url).build()
  3. 处理Response:Response response = client.newCall(request).execute();

0x31 OkHttpClient

OkHttpClient:

请求工厂,用来发送HTTP请求,并读取响应。

OkHttpClient对象实例应该被共享

当使用单例创建OkHttpClient实例的时候并对所有的HTTP请求进行重用,OkHttpClient表现的最好。因为每个实例都拥有属于自己的链接池和线程池。重用这些链接和线程可以有效的减少延时和内存。相反,如果为每个请求创建一个实例会浪费那些在池中的资源。

使用默认构造器会创建一个默认设置的共享实例,或者使用Builder来创建一个自定义配置的共享实例。

如何构建一个自定义的OkHttpClient
通过自定义构建的共享OkHttpClient实例会共享同一个链接池,线程池,和配置,使用Builder方法配置用于特殊目的。

及时回收,当不需要处理的时候
OkHttpClient实例持有的链接和线程池,在空闲的时候会被自动释放。但是如果你的应用需要及时回收未使用的资源时,还是很有必要这么做的。

关闭调度器服务,这将引起未来实例的请求将被拒绝。

使用client.connectionPool().evictAll()清理链接池,注意,此时链接池的守护线程并不会马上退出。

如果你创建的实例中定义了缓存,调用client.cache().close(),需要注意的是,针对关闭的缓存创建调用是一个错误,这样做将导致调用崩溃。

OkHttp 也为http/2链接创建了守护线程,如果处于空闲状态将会自动退出。

继“Java开发微信朋友圈PC版系统-架构1.0”之后,debug这段时间日撸夜撸,终于赶在春节放假前给诸位带来了这一系统的架构2.0版本,特此分享给诸位进行学习,以掌握、巩固更多的技术栈以及项目和产品开发经验,同时也为即将到来的金三银四跳槽季做准备! 言归正传,下面仍然以问答的方式介绍下本门课程的相关内容! (1)问题一:这是一门什么样的课程? 很明显,本门课程是建立在架构1.0,即 第1门课程 的基础上发布的,包含了架构1.0的内容,即它仍然是一门项目、产品实战课,基于Spring Boot2.X + 分布式中间件开发的一款类似“新浪微博”、“QQ空间”、“微信朋友圈”PC版的互联网社交软件,包含完整的门户网前端 以及 后台系统管理端,可以说是一套相当完整的系统! (2)问题二:架构2.0融入了哪些新技术以及各自有什么作用? 本课程对应着系统架构2.0,即第2阶段,主要目标:基于架构1.0,优化系统的整体性能,实现一个真正的互联网社交产品;其中,可以学习到的技术干货非常多,包括:系统架构设计、Spring Boot2.X、缓存Redis、多线程并发编程、消息中间件RabbitMQ、全文搜索引擎Elastic Search、前后端消息实时通知WebSocket、分布式任务调度中间件Elastic Job、Http Restful编程、Http通信OKHttp3、分布式全局唯一ID、雪花算法SnowFlake、注册中心ZooKeeper、Shiro+Redis 集群Session共享、敏感词自动过滤、Java8 等等; A.  基于Elastic Search实现首页列表数据的初始化加载、首页全文检索;B.  基于缓存Redis缓存首页朋友圈“是否已点赞、收藏、关注、评论、转发”等统计数据;整合Shiro实现集群部署模式下Session共享;C.  多线程并发编程并发处理系统产生的废弃图片、文件数据;D.  基于Elastic Job切片作业调度分布式多线程清理系统产生的废弃图片;E.  基于RabbitMQ解耦同步调用的服务模块,实现服务模块之间异步通信;F.  基于WebSocket实现系统后端 与 首页前端 当前登录用户实时消息通知;G.  基于OKHttp3、Restful风格的Rest API实现ES文档、分词数据存储与检索;H.  分布式全局唯一ID 雪花算法SnowFlake实现朋友圈图片的唯一命名;I.  ZooKeeper充当Elastic Job创建的系统作业的注册中心;J.  为塑造一个健康的网络环境,对用户发的朋友圈、评论、回复内容进行敏感词过滤;K.  大量优雅的Java8  Lambda编程、Stream编程;  (3)问题三:系统运行起来有效果图看吗?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值