显然,我们必须在Java还没有准备好支持HTTP2客户端编程的情况下(即使用Java 8及以下版本),提供HTTP2客户端应用的解决方案。目前流行的类库如下:

  • OkHttp
  • Eclipse Jetty
  • Netty
  • Apache HttpComponents (Apache HC)

其中,Eclipse Jetty和Netty都同时提供客户端和服务端。而曾经广泛使用的Apache HC已经逐渐掉队,至今没有正式支持HTTP2的版本发布。所以这里特别推荐OkHttp,而且OkHttp还适合在Android应用中作为HTTP客户端。

OkHttp的最新版本3.10.0,2018年2月25日发布,特性如下:

  • 支持HTTP2,默认采用TLS 1.2
  • GZIP压缩
  • 缓存响应对象

在Maven项目中,pom.xml配置如下:

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

编写HTTP2客户端应用如下:

1. 创建OkHttpClient

1.1 默认配置

OkHttpClient client = new OkHttpClient();

1.2 定制配置

OkHttpClient client = new OkHttpClient.Builder().authenticator(new Authenticator() {...}.build();

2. 创建请求

2.1 GET请求

Request request = new Request.Builder().url("https://www.mydomain.com/").build();//GET by default

2.2 POST请求

RequestBody strBody = RequestBody.create(MediaType.parse("text/x-markdown; charset=utf-8"), postBodyStr);
RequestBody jsonBody = RequestBody.create(MediaType.parse("application/json; charset=utf-8"), postBodyJsonStr);
Request request = new Request.Builder().url("https://www.mydomain.com").post(mybody).build();

3. 发送请求并处理响应

3.1 同步请求

Response response = client.newCall(request).execute(){//synch callif (!response.isSuccessful()) throw new IOException("Unexpected code " + response);System.out.println(response.body().string());
}

3.2 异步请求

client.newCall(request).enqueue(new Callback() {//asynch call@Override public void onFailure(Call call, IOException e) {e.printStackTrace();}@Override public void onResponse(Call call, Response response) throws IOException {try (ResponseBody responseBody = response.body()) {if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);Headers responseHeaders = response.headers();for (int i = 0, size = responseHeaders.size(); i < size; i++) {System.out.println(responseHeaders.name(i) + ": " + responseHeaders.value(i));}System.out.println(responseBody.string());}}
});

4. OkHttp访问HTTPS服务

final TrustManager[] trustAllCerts = new TrustManager[]{new X509TrustManager() {@Overridepublic void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {}@Overridepublic void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {}@Overridepublic java.security.cert.X509Certificate[] getAcceptedIssuers() {return new java.security.cert.X509Certificate[]{};}}
};final HostnameVerifier verifiedAllHostname = new HostnameVerifier() {@Overridepublic boolean verify(String hostname, SSLSession session) {return true;}
};SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, trustAllCerts, new java.security.SecureRandom());
SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();OkHttpClient client = new OkHttpClient.Builder().sslSocketFactory(sslSocketFactory, (X509TrustManager) trustAllCerts[0]);.hostnameVerifier(verifiedAllHostname).connectTimeout(60, TimeUnit.SECONDS).readTimeout(60, TimeUnit.SECONDS).writeTimeout(60, TimeUnit.SECONDS).retryOnConnectionFailure(true).build();Request request = new Request.Builder().url("https://localhost:9443/hello").build();Response response = client.newCall(request).execute();
System.out.println(response.body().string());

这里我们只使用OkHttp原生API编写HTTP2客户端应用。在Spring Boot 2.0版本中,我们还可以使用Spring Boot starters for OkHttp,辅助编写HTTP2客户端。

参考链接:

http://square.github.io/okhttp/

https://www.eclipse.org/jetty

http://netty.io/

https://hc.apache.org/

https://github.com/freefair/okhttp-spring-boot

Java8中基于OkHttp3编写HTTP2客户端详解相关推荐

  1. JavaMail邮件发送,网页、客户端详解-JavaWeb学习6.9

    JavaMail邮件发送 JavaMail发送邮件 笔记 导入mail.jar包 eclipse编写时的目录 网页上发送邮件 采用qq邮箱和网易邮箱 代码 客户端发送邮箱 客户端采用foxmail 服 ...

  2. 新浪微博客户端详解(一)

    使用新浪sdk里面的demo,安装到手机之后认证的显示界面是 里面总共使用了三种授权认证方式,这里面我只讲解第三种授权认证方式,其他两种方式可以自己研究一下. 本人在使用auth2.0的授权认证过程中 ...

  3. oracle中procedure用法,oracle中的procedure编写和使用详解

    1.创建/修改 sql;"> CREATE [OR REPLACE] PROCEDURE procedure_name [(parameter_list)] {IS|AS} [loca ...

  4. 什么是服务端与客户端详解

    1. 你上网看网页 浏览器是客户端程序 服务器上的网站是服务器端程序 2. 你聊天用QQ QQ是客户端程序 腾讯机房放的是服务器端程序 3. 你打魔兽世界 电脑上装的是客户端程序 九城放的是服务器端程 ...

  5. 四大中三家已面向客户推出机器人业务解决方案?别逗了,先用机器人自我革命吧! post by 上海嘉冰信息技术...

    近日,四大会计师事务所推出的机器人财务及业务解决方案的话题引爆朋友圈.鉴于该话题的前沿性以及对财务及业务领域从业人员未来职业发展有巨大的影响,引起热门讨论在所难免.小编先来汇总下目前国际四大会计师事务 ...

  6. 基于UDP的socket客户服务器编程

    前面我们写了关于TCP的客户/服务器模式,现在我们写关于UDP的客户/服务器模式. 基于TCP编写的应用程序和基于TCP编写的应用程序之间存在一些本质的差异,其原因在于这两个传输层之间的差别:UDP是 ...

  7. Java8中的流操作-基本使用性能测试

    一.流(Stream)简介 流是 Java8 中 API 的新成员,它允许你以声明式的方式处理数据集合(通过查询语句来表达,而不是临时编写一个实现).这有点儿像是我们操作数据库一样,例如我想要查询出热 ...

  8. sql编程接收一个集合_T-SQL中基于集合的程序编程方法简介

    sql编程接收一个集合 介绍 (Introduction) Most IT professionals started their studies or careers by learning pro ...

  9. java8中的流(Stream)

    流式编程爱 撸码就是快,流式编程好 代码传家宝 Stream API 概念: Stream 流处理,首先要澄清的是 java8 中的 Stream 与 I/O 流 InputStream 和 Outp ...

最新文章

  1. 如何优雅地训练大型模型?
  2. AWS Device Farm介绍及Appium踩过的坑
  3. AIX中一些常用的命令汇总
  4. PHP后期静态绑定概念和用法
  5. 配置zabbix监控windows,cmd运行报错cannot connect to Service Manager: [0x00000005]
  6. 认识和入门 WebRTC
  7. The Web Audio autoplay policy will be re-enabled in 音频无法播放
  8. winfrom弹出窗口用timer控件控制倒计时20秒后关闭
  9. 15个基本的C#面试问题
  10. Jakarta EE的拟议命名空间
  11. Quartz 2 Scheduler示例
  12. Oracle 数据怎么实时同步到 Kafka | 亲测干货分享建议收藏
  13. linux下包管理工具apt-get
  14. BABOK - BA计划和监控(BA Planning Monitoring)概要
  15. python,web框架说明
  16. Python 安装openGL教程
  17. AD637_高精度,宽带RMS-DC转换器
  18. php短信验证码接口免费,[php短信验证码接口]PHP 短信验证码
  19. linux 安装zh.utf 8,debian下安装locale并设置zh_CN.UTF-8
  20. physx: pid balance controll

热门文章

  1. 对程序员超有用的网站!一定要收藏起来!
  2. 近七十部动漫长期高速下载
  3. python 泰森多边形边界_简单泰森多边形的绘制
  4. 5.1 IPSec概述
  5. 【前端VUE的学习】
  6. gm21模型python_Part.1.E.6.containers.ipynb
  7. 阿里域名、bluehost建站
  8. 非对称加密、数字摘要、数字签名、数字证书、SSL、HTTPS及其他
  9. 单页面应用的页面跳转及如何通过url跳转至指定页面
  10. scrollTop和offsetTop区别