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三步走
- 创建OkHttpClient对象:new OkHttpClient()
- 创建Request对象:new Request.Builder().url(url).build()
- 处理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系列之入门篇相关推荐
- 【IPFS + 区块链 系列】 入门篇 - IPFS + Ethereum (下篇)-ipfs + Ethereum 大图片存储
目录 1. 系列文章 2. 项目描述及效果展示 3. 阅读本文需要掌握的知识 4. 源码 5. 运行程序 6. 技术交流 1. 系列文章 [IPFS + 区块链 系列] 入门篇 - IPFS环境配置 ...
- IPFS + 区块链 系列】 入门篇 - IPFS + Ethereum (中篇)-js-ipfs-api - 图片上传到IPFS以及下载
目录 1. 项目效果图 2. 创建React项目 3. 完成UI逻辑 4. 安装ipfs-api 5. App.js导入IPFS 6. 实现上传图片到IPFS的Promise函数 7. 上传图片到IP ...
- 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 安 ...
- Python系列之入门篇——HDFS
Python系列之入门篇--HDFS 简介 HDFS (Hadoop Distributed File System) Hadoop分布式文件系统,具有高容错性,适合部署在廉价的机器上.Python ...
- c# hdf5 写string_Pandas系列之入门篇——HDF5
Python系列之入门篇--HDF5 简介 HDF5(层次性数据格式)作用于大数据存储,其高效的压缩方式节约了不少硬盘空间,同时也给查询效率带来了一定的影响,压缩效率越高,查询效率越低.pandas ...
- Yocto系列讲解[入门篇] 1 - 快速入门熟悉Yocto的构建
By: fulinux E-mail: fulinux@sina.com Blog: https://blog.csdn.net/fulinus 喜欢的盆友欢迎点赞和订阅! 你的喜欢就是我写作的动力! ...
- C# 串口操作系列(1) -- 入门篇,一个标准的,简陋的串口例子。
我假设读者已经了解了c#的语法,本文是针对刚打算解除串口编程的朋友阅读的,作为串口编程的入门范例,也是我这个系列的基础. 我们的开发环境假定为vs2005(虽然我在用vs2010,但避免有些网友用20 ...
- 软件测试系列之入门篇(一)
一.你知道软件测试有多重要吗? 在国际上,软件测试(软件质量控制)是一件非常重要的工程工作,测试也作为一个非常独立的职业.在IBM.Microsoft等开发大型系统软件公司,很多重要项目的开发测试人员 ...
- 软件測试系列之入门篇(一)
一.你知道软件測试有多重要吗? 在国际上.软件測试(软件质量控制)是一件很重要的project工作.測试也作为一个很独立的职业. 在IBM.Microsoft等开发大型系统软件公司,许多重要项目的开发 ...
最新文章
- ffmpeg frei0r filter 参数及效果
- WCF(Sender) to MSMQ to WCF(Receiver)
- 从玩具到游戏,另类的项目激励机制
- 删除binlog mysql_mysql中删除binlog的方法?mysql中如何删除binlog?
- boost::current_exception_cast的用法测试程序
- 分布式文件系统—HDFS—shell命令
- 获取访客进站关键词_拼多多访客突然下降是为什么?拼多多访客突然暴涨又是怎么回事?...
- php pdo 预处理删除,PHP PDO扩展整理,包括环境配置\基本增删改查\事务\预处理
- django models 配置
- C++自定义函数类型——typedef的使用
- Cubieboard通过aria2和minidlna来架设家庭媒体中心
- Silverlight笔记:模态窗体的实现
- [OGRE]最小ogre程序的流程
- xshell5下载和安装教程
- 【FL攻防综述】Privacy and Robustness in Federated Learning: Attacks and Defenses
- elasticsearch系列二:索引详解(快速入门、索引管理、映射详解、索引别名)
- Eclipse Plungins--Pydev
- 【anaconda】彻底解决windows下anaconda3占用C盘问题(改了envs、pkgs安装路径依旧占用C盘)
- 华为会议终端TE10 SIP配置范例
- 配置文件导入服务器什么意思,配置服务器需要什么意思
热门文章
- 任务管理器无法结束进程解决办法
- 算法小课堂(一)暴力枚举
- 简述SCA及SCA和SOA的关系
- VK1088B QFN32L超小体积封装4*4 LCD液晶段码驱动IC/LCD液晶驱动IC
- 手机上怎么学习计算机,手机投屏到Win10电脑上怎么操作呢?-电脑自学网
- 联动优势 java_联动优势快捷支付
- input 正则校验
- html 标签 标记区别,html header标签和footer标签区别的两点总结(附元素区别实例)...
- MathType在字母上加虚线的方法
- Python育儿系列-10以内减法、20以内减法、20以内混合运算