OKHttp3 快速开始
文章目录
- 一、什么是OKHttp3
- 二、基于springboot的RestTemplate、okhttp和HttpClient对比
- 三、Okhttp的基本使用
- 1. maven引入
- 2. 创建OkHttpClient实例
- 2.1 HTTP头部的设置和读取
- 2.2 设置请求超时时间
- 3. RestTemplate + okhttp 实现远程调用
- 4. Connection作为请求头: OkHttpClient单例和长连接Connection Keep-Alive
- 四、使用过程常见问题总结
- 1. 在项目中引入okhttp的4.4.0版后发现idea点run和debug没响应,重启也没反应
- 2. OkHttp打印响应的body中json字符串
- 3. OkHttp忽略证书
- 五、其他参考
一、什么是OKHttp3
官网地址:https://square.github.io/okhttp/
github地址:https://github.com/square/okhttp
OKHttp是一个当前主流的网络请求的开源框架
Square公司(该公司还贡献了Picasso)开发,用于替代HttpUrlConnection和Apache HttpClient
Android4.4开始,google已经开始将源码中的HttpURLConnection替换为OkHttp
Android6.0里已移除HttpClient。
OkHttp is an HTTP client that’s efficient by default:
- HTTP/2 support allows all requests to the same host to share a socket.
- Connection pooling reduces request latency (if HTTP/2 isn’t available).
- Transparent GZIP shrinks download sizes.
- Response caching avoids the network completely for repeat requests.
相对于其他网络框架,有如下优点:
支持 Spdy、 Http1.X、 Http2、 Quic以及 WebSocket
连接池复用底层 TCP(Socket),减少请求延时
无缝的支持 GZIP减少数据流量
缓存响应数据减少重复的网络请求
请求失败自动重试主机的其他 ip,自动重定向
总结: OkHttp现在应该算是最火的Http第三方库。
二、基于springboot的RestTemplate、okhttp和HttpClient对比
参考URL: https://www.cnblogs.com/wzk-0000/p/10955406.html
HttpClient:代码复杂,还得操心资源回收等。代码很复杂,冗余代码多,不建议直接使用。
RestTemplate: 是 Spring 提供的用于访问Rest服务的客户端, RestTemplate 提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。
okhttp:OkHttp是一个高效的HTTP客户端,允许所有同一个主机地址的请求共享同一个socket连接;连接池减少请求延时;透明的GZIP压缩减少响应数据的大小;缓存响应内容,避免一些完全重复的请求。
当网络出现问题的时候OkHttp依然坚守自己的职责,它会自动恢复一般的连接问题,如果你的服务有多个IP地址,当第一个IP请求失败时,OkHttp会交替尝试你配置的其他IP,OkHttp使用现代TLS技术(SNI, ALPN)初始化新的连接,当握手失败时会回退到TLS 1.0。
三、Okhttp的基本使用
基本使用——OkHttp3详细使用教程
参考URL: https://www.cnblogs.com/it-tsz/p/11748674.html
OkHttp的使用是非常简单的. 它的请求/响应 API 使用构造器模式builders来设计,它支持阻塞式的同步请求和带回调的异步请求。
1. maven引入
maven仓库查找并引入
<!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp -->
<dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>3.14.9</version>
</dependency>
2. 创建OkHttpClient实例
通过OkHttpClient可以发送一个Http请求,并读取该Http请求的响应,它是一个生产Call的工厂。
此外,受益于一个共享的响应缓存/线程池/复用的连接等因素,绝大多数应用使用一个OkHttpClient实例,便可以满足整个应用的Http请求。
三种创建实例的方法:
- 创建一个默认配置OkHttpClient,可以使用默认的构造函数。
- 通过new OkHttpClient.Builder()方法来一步一步配置一个OkHttpClient实例。
- 如果要求使用现有的实例,可以通过newBuilder()方法来进行构造。
OkHttpClient client = new OkHttpClient();
OkHttpClient clientWith30sTimeout = client.Builder().readTimeout(30, TimeUnit.SECONDS).build();
OkHttpClient client = client.newBuilder().build();
- GET请求
demo:
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();
}
Request
简单看一下Request类,可以发现它代表一个Http请求,需要注意的是Request一旦build()之后,便不可修改。
主要通过new Request.Builder()来一步一步构造的。
默认是Get方法,
Response
Response代表一个Http的响应,这个类的实例不可修改。
2) 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();
}
MediaType用于描述Http请求和响应体的内容类型,也就是Content-Type。
例如,MediaType.parse(“application/json; charset=utf-8”);这个就带表请求体的类型为JSON格式的。
定义好数据类型,还要将其变为请求体,最后通过post()方法,随请求一并发出。
2.1 HTTP头部的设置和读取
HTTP响应头和请求头信息对照表
http://tools.jb51.net/table/http_header
HTTP 头的数据结构是 Map<String, List>类型。也就是说,对于每个 HTTP 头,可能有多个值。但是大部分 HTTP 头都只有一个值,只有少部分 HTTP 头允许多个值。
OkHttp的处理方式是:
- 使用header(name,value)来设置HTTP头的唯一值,如果请求中已经存在响应的信息那么直接替换掉。
- 使用addHeader(name,value)来补充新值,如果请求头中已经存在name的name-value,那么还会继续添加,请求头中便会存在多个name相同而value不同的“键值对”。
- 使用header(name)读取唯一值或多个值的最后一个值
- 使用headers(name)获取所有值
OkHttpClient client = new OkHttpClient();Request request = new Request.Builder().url("https://github.com").header("User-Agent", "My super agent").addHeader("Accept", "text/html").build();Response response = client.newCall(request).execute();
if (!response.isSuccessful()) {throw new IOException("服务器端错误: " + response);
}System.out.println(response.header("Server"));
System.out.println(response.headers("Set-Cookie"));
2.2 设置请求超时时间
OkHttp3超时设置和超时异常捕获
参考URL: https://blog.csdn.net/do168/article/details/51848895/
设置超时移到了OkHttpClient.Builder中,所以最新的设置超时的代码如下
OkHttpClient client = new OkHttpClient.Builder().connectTimeout(10, TimeUnit.SECONDS).readTimeout(20, TimeUnit.SECONDS).build();
3. RestTemplate + okhttp 实现远程调用
RestTemplate + okhttp 实现远程调用
参考URL: https://zhuanlan.zhihu.com/p/108765123
- 引入maven
<!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp -->
<dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>3.14.9</version>
</dependency>
2)声明 RestTemplate
@Component
public class OkHttpConfig {/*** 基于OkHttp3配置RestTemplate* @return*/@Beanpublic RestTemplate restTemplate() {return new RestTemplate(new OkHttp3ClientHttpRequestFactory());}}
3)测试验证
@RestController
public class TestController {@AutowiredRestTemplate restTemplate;@Testpublic void testRestTemplate(){ResponseEntity<Map> forEntity = restTemplate.getForEntity("请求的url",Map.class);Map body = forEntity.getBody();System.out.println(body );}
}
4. Connection作为请求头: OkHttpClient单例和长连接Connection Keep-Alive
OkHttp使用踩坑记录总结(一):OkHttpClient单例和长连接Connection Keep-Alive
参考URL: https://blog.csdn.net/sinat_36553913/article/details/104054028
HTTP的KeepAlive就是浏览器和服务端之间保持长连接,这个连接是可以复用的。当客户端发送一次请求,收到相应内容后,这个连接会保持一段时间,在该时间内的第二次就不需要再重新建立连接,就可以直接使用这次的连接来发送请求了,极大的提高了速度。
KeepAlive在增加访问效率的同时,也会增加服务器的压力。
- http1.0中默认是关闭的,需要在http头加入”Connection: Keep-Alive”,才能启用Keep-Alive;
- http 1.1中默认启用Keep-Alive,如果加入”Connection: close “才关闭。目前大部分浏览器都是用http1.1协议,也就是说默认都会发起Keep-Alive的连接请求了,所以是否能完成一个完整的Keep- Alive连接就看服务器设置情况。
OkHttp支持HTTP/1.1和HTTP/2协议。HTTP/1.1和HTTP/2的http请求都是建立在TCP连接基础之上的,所以他们的性能极大的依赖于TCP连接的配置。每个TCP连接都会进行三次握手,并且因为TCP的拥塞控制使用的滑动窗口和慢开始算法导致网络带宽利用率不高。所以,在HTTP/2不可用时,OkHttp使用了连接池,避免为每个请求都创建连接。
复用长连接,避免了创建TCP连接的三次握手,我们简单了解下HTTP请求头中Connection和Keep-Alive。
Connection作为请求头的通用参数,其控制了请求连接在当前事务完成后是否继续保持。如果其值被设置为keep-alive, 则表示该连接是长连接,允许之后的相同地址的请求复用。还可以设置为close,每次请求结束后关闭连接。但是该参数在HTTP/2中不再使用。
okhttp都是长连接是因为okhttp最低只支持到http /1.1版本,当http/2不可用时,会使用连接池来复用长连接。 请求时希望不使用长连接,可显式设置okhttp的请求头 Connection为close。
浏览器默认使用http1.1,而http1.1默认是connection:keepalive
OkHttp默认是使用长连接进行请求,那么如果要发送非长连接的请求如何实现?
我们可以在请求时设置请求头参数Connection参数为close。
.addHeader("Connection", "close")
该参数,亲测可用!
四、使用过程常见问题总结
1. 在项目中引入okhttp的4.4.0版后发现idea点run和debug没响应,重启也没反应
解决idea导入kotlin项目时,项目无法编译运行的问题
参考URL: https://blog.csdn.net/wangyuanjiet/article/details/81220987
OkHttp 4 正式版发布,从 Java 切换到 Kotlin
参考URL: https://www.oschina.net/news/107848/okhttp-4-0-0-released
idea2017等低版本引入okhttp4无法编译运行
参考URL: https://blog.csdn.net/aoeace/article/details/103157193
现象:
在项目中引入okhttp的4.4.0版后发现idea点run和debug没响应,重启也没反应,换成3.14.2就好了。
原因分析:
pom引入okhttp4.x以前的版本idea可以正常编译运行,升级到okhttp4.x后,无法编译运行
因为OkHttp 4.x将我们的实现语言从Java升级到Kotlin,并使其他所有内容保持不变。我们选择Kotlin是因为它在与Java紧密集成的同时为我们提供了强大的新功能。
解决方式:
方案一:
1、选中菜单的file,选择setting,kotlin update
2、选中菜单的file,选择project structure=>Modules=>选中项目=>点击加号,加上Kotlin
方案二:使用低版本,如 3.x版本的okhttp。 (本人暂时采用该方案)
<!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp -->
<dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>3.14.9</version>
</dependency>
2. OkHttp打印响应的body中json字符串
问题背景:
使用 把String json = response.body().toString(); 发现打印的不是
问题解决:
换成String json = response.body().string();就可以了
总结:OkHttp要的http响应的body体内容,是使用response.body().string();
3. OkHttp忽略证书
Java通过OKHttp发送https请求(忽略认证)
https://www.cnblogs.com/areful/p/10381859.html
private static TrustManager[] buildTrustManagers() {return new TrustManager[]{new X509TrustManager() {@Overridepublic void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) {}@Overridepublic void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) {}@Overridepublic java.security.cert.X509Certificate[] getAcceptedIssuers() {return new java.security.cert.X509Certificate[]{};}}};}
TrustManager[] trustAllCerts = buildTrustManagers();final SSLContext sslContext = SSLContext.getInstance("SSL");sslContext.init(null, trustAllCerts, new java.security.SecureRandom());final SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();OkHttpClient.Builder builder = new OkHttpClient.Builder();builder.sslSocketFactory(sslSocketFactory, (X509TrustManager) trustAllCerts[0]);builder.hostnameVerifier((hostname, session) -> true);OkHttpClient client = builder.connectTimeout(10, TimeUnit.SECONDS).writeTimeout(10, TimeUnit.SECONDS).readTimeout(30, TimeUnit.SECONDS).build();...
亲测可用!
五、其他参考
你必须学会的OkHttp,带你快速上车
参考URL: https://blog.51cto.com/14541311/2438941
easy-okhttp是对OkHttp网络框架封装,提供文件上传和下载,表单(含文件)提交,链式调用,支持HTTPS和自定义签名证书等特性。
参考URL: https://gitee.com/yuanzizhenxin/easy-okhttp
OKHttp3 快速开始相关推荐
- android端使用http2.0,android Retrofit2+okHttp3使用总结
使用前准备 Build.gradle文件配置 dependencies配置 compile 'com.squareup.retrofit2:retrofit:2.0.0' compile 'com.s ...
- SpringBoot系列: RestTemplate 快速入门
==================================== 相关的文章 ==================================== SpringBoot系列: 与Sprin ...
- 【我的Android进阶之旅】如何快速寻找Android第三方开源库在Jcenter上的最新版本...
问题描述 解决方法 先了解compile comsquareupokhttpokhttp240的意义 了解Jcenter和Maven jcenter Maven Central 理解jcenter和M ...
- mvp架构 java_GitHub - AnthonyCoder/MvpForJava: 一个可直接快速引入的 Java 版本的模块化 MVP 框架...
使用Java构建的一个模块化的MVP的项目 个人项目仅供学习使用,感谢以下开放Api: Demo简介 该 Demo 更加详细的封装思路,请点击文章如何既装逼又优雅的设计一个模块化的MVP架构 提供给初 ...
- 利用Android Studio快速搭建App
大家好,我是烤鸭: 给大家分享一个简单的用Android Studio快速搭建app 工具: Android Studio 64位 专业版 插件: Datepicker Timepicker okht ...
- Java EE 架构设计——基于okhttp3 的网络框架设计
转载请注明出处:http://blog.csdn.net/smartbetter/article/details/77893903 本篇文章带大家设计一套满意业务需求.代码健壮高效(高内聚低耦合)并且 ...
- WMPF微信小程序框架 微信刷脸登录 获取openId 授权获取手机号 快速接入 快速集成
官方Demo Github:WMPF微信小程序框架 推荐开发前先快速了解API:wiki 快速接入Demo:WMPF快速接入demo 运行环境下载:WMPF运行环境(待上传) 应⽤版本 刷脸 SDK, ...
- OkHttp3源码分析二 拦截器 上
在上一篇中,我们大概知道了OkHttp进行网络请求的大概的流程: 按着流程,一个一个的分析. RetryAndFollowUpInterceptor 构造方法: public RetryAndFoll ...
- OkHttp3使用详解
引言 最初我们进行HTTP请求时使用的是HttpURLConnection或者HttpClient,那么这两者都有什么优缺点呢? HttpClient是Apache基金会的一个开源网络库,功能十分强大 ...
最新文章
- Linux机器建立密钥信任
- 深入浅出理解c++虚函数
- 公众号怎么设置滑动文字_上善.小知——(1)公众号白名单怎么设置?
- 牛津书虫系列双语读物
- 实验 5 编写、调试具有多个段的
- Go Web 编程--如何确保Cookie数据的安全传输
- 软硬件负载均衡器:F5、Array、Nginx、LVS、HAProxy
- 使用HP Vertica进行.NET编程
- rea t插件 vscode_VSCode构建汇编语言环境(配置VSCode自动调用dosbox编译运行MASM/TASM程序)...
- linux fork脚本,shell调度脚本的三种不同方法(fork, exec, source)
- Python版本选择
- 电脑突然显示只有C盘,其他磁盘不显示了----解决方法(很简单)
- 海伯利安发布首个区块链红包RP
- Fibonacci数列(斐波那契数列)
- Docker基础知识及安装部署
- JavaScript - 动画介绍与学习
- 微信小程序之videoshow-fullscreen-btn失效问题
- 【卡特兰数】【高精】WZK打雪仗(war)
- 给正在排版毕业论文的你:高校毕业论文Latex格式排版模版
- Adobe Acrobat Xi Pro v11.0.10官方简体中文版 功能强大【推荐】
热门文章
- 郑大计算机专业保研都去了哪些大学,郑州大学一个班30人全部保研 过半保送“985”和中科院!...
- 【译】 如何使用ArcGIS Earth来辅助规划一场马拉松
- 图解完全备份,增量备份,差异备份
- C/C++线性表的实现
- visual studio如何运行并调试C语言代码
- 移植UPnP CyberLink库到WinCE的问题与解决方法
- 对两个有序数组重新去重合并排序js实现
- 基于Swing的Java扫雷游戏
- 不知道这是个什么网址,先留着。
- 腾讯新闻基于 Flink PipeLine 模式的实践