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链接创建了守护线程,如果处于空闲状态将会自动退出。

OkHttp系列之入门篇相关推荐

  1. 【IPFS + 区块链 系列】 入门篇 - IPFS + Ethereum (下篇)-ipfs + Ethereum 大图片存储

    目录 1. 系列文章 2. 项目描述及效果展示 3. 阅读本文需要掌握的知识 4. 源码 5. 运行程序 6. 技术交流 1. 系列文章 [IPFS + 区块链 系列] 入门篇 - IPFS环境配置 ...

  2. IPFS + 区块链 系列】 入门篇 - IPFS + Ethereum (中篇)-js-ipfs-api - 图片上传到IPFS以及下载

    目录 1. 项目效果图 2. 创建React项目 3. 完成UI逻辑 4. 安装ipfs-api 5. App.js导入IPFS 6. 实现上传图片到IPFS的Promise函数 7. 上传图片到IP ...

  3. IPFS + 区块链 系列】 入门篇 - IPFS + Ethereum (上篇)-js-ipfs-api

    目录 1. 内容简介 2. IPFS-HTTP效果图 3. 实现步骤 3.1 安装create-react-app 3.2 React项目创建 3.3 运行React项目 3.4 浏览项目 3.5 安 ...

  4. Python系列之入门篇——HDFS

    Python系列之入门篇--HDFS 简介 HDFS (Hadoop Distributed File System) Hadoop分布式文件系统,具有高容错性,适合部署在廉价的机器上.Python ...

  5. c# hdf5 写string_Pandas系列之入门篇——HDF5

    Python系列之入门篇--HDF5 简介 HDF5(层次性数据格式)作用于大数据存储,其高效的压缩方式节约了不少硬盘空间,同时也给查询效率带来了一定的影响,压缩效率越高,查询效率越低.pandas ...

  6. Yocto系列讲解[入门篇] 1 - 快速入门熟悉Yocto的构建

    By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! ...

  7. C# 串口操作系列(1) -- 入门篇,一个标准的,简陋的串口例子。

    我假设读者已经了解了c#的语法,本文是针对刚打算解除串口编程的朋友阅读的,作为串口编程的入门范例,也是我这个系列的基础. 我们的开发环境假定为vs2005(虽然我在用vs2010,但避免有些网友用20 ...

  8. 软件测试系列之入门篇(一)

    一.你知道软件测试有多重要吗? 在国际上,软件测试(软件质量控制)是一件非常重要的工程工作,测试也作为一个非常独立的职业.在IBM.Microsoft等开发大型系统软件公司,很多重要项目的开发测试人员 ...

  9. 软件測试系列之入门篇(一)

    一.你知道软件測试有多重要吗? 在国际上.软件測试(软件质量控制)是一件很重要的project工作.測试也作为一个很独立的职业. 在IBM.Microsoft等开发大型系统软件公司,许多重要项目的开发 ...

最新文章

  1. ffmpeg frei0r filter 参数及效果
  2. WCF(Sender) to MSMQ to WCF(Receiver)
  3. 从玩具到游戏,另类的项目激励机制
  4. 删除binlog mysql_mysql中删除binlog的方法?mysql中如何删除binlog?
  5. boost::current_exception_cast的用法测试程序
  6. 分布式文件系统—HDFS—shell命令
  7. 获取访客进站关键词_拼多多访客突然下降是为什么?拼多多访客突然暴涨又是怎么回事?...
  8. php pdo 预处理删除,PHP PDO扩展整理,包括环境配置\基本增删改查\事务\预处理
  9. django models 配置
  10. C++自定义函数类型——typedef的使用
  11. Cubieboard通过aria2和minidlna来架设家庭媒体中心
  12. Silverlight笔记:模态窗体的实现
  13. [OGRE]最小ogre程序的流程
  14. xshell5下载和安装教程
  15. 【FL攻防综述】Privacy and Robustness in Federated Learning: Attacks and Defenses
  16. elasticsearch系列二:索引详解(快速入门、索引管理、映射详解、索引别名)
  17. Eclipse Plungins--Pydev
  18. 【anaconda】彻底解决windows下anaconda3占用C盘问题(改了envs、pkgs安装路径依旧占用C盘)
  19. 华为会议终端TE10 SIP配置范例
  20. 配置文件导入服务器什么意思,配置服务器需要什么意思

热门文章

  1. 任务管理器无法结束进程解决办法
  2. 算法小课堂(一)暴力枚举
  3. 简述SCA及SCA和SOA的关系
  4. VK1088B QFN32L超小体积封装4*4 LCD液晶段码驱动IC/LCD液晶驱动IC
  5. 手机上怎么学习计算机,手机投屏到Win10电脑上怎么操作呢?-电脑自学网
  6. 联动优势 java_联动优势快捷支付
  7. input 正则校验
  8. html 标签 标记区别,html header标签和footer标签区别的两点总结(附元素区别实例)...
  9. MathType在字母上加虚线的方法
  10. Python育儿系列-10以内减法、20以内减法、20以内混合运算