博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java8中基于OkHttp3编写HTTP2客户端详解
阅读量:4178 次
发布时间:2019-05-26

本文共 3766 字,大约阅读时间需要 12 分钟。

显然,我们必须在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配置如下:

com.squareup.okhttp3
okhttp
3.10.0

编写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 call	if (!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() {        @Override        public void checkClientTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {}        @Override        public void checkServerTrusted(java.security.cert.X509Certificate[] chain, String authType) throws CertificateException {}        @Override        public java.security.cert.X509Certificate[] getAcceptedIssuers() {            return new java.security.cert.X509Certificate[]{};        }    }};final HostnameVerifier verifiedAllHostname = new HostnameVerifier() {    @Override    public 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

转载地址:http://tmlai.baihongyu.com/

你可能感兴趣的文章
Mybatis+impala插入超过510个字符串的字段报:HIVE_PARAMETER_QUERY_DATA_TYPE_ERR_NON_SUPPORT_DATA_TYPE
查看>>
SpringBoot项目启动完成自动打开网址
查看>>
记录一下把mapper.xml文件放在java的坑
查看>>
反射的使用
查看>>
使用Stream排序分组
查看>>
linux安装mysql 5.7.23二进制 安装jdk tomcat
查看>>
mysql总结 windows 版本
查看>>
POI 导出工具类
查看>>
HTTP请求工具类
查看>>
Ngnix+tomcat 集群以及session共享
查看>>
Nginx配置多个项目放在不同的tomcat中,共享同一个端口
查看>>
mysql的JDBC连接工具类
查看>>
ORACLE的JDBC连接工具类
查看>>
利用多线程(用到原子类AtomicInteger)往数据库批量插入大量数据
查看>>
多个线程操作数组
查看>>
定长线程池的应用
查看>>
生产者和消费者模式
查看>>
ArrayBlockingQueue的简单使用
查看>>
Git 常用命令总结(一)
查看>>
Git 常用命令总结(二)
查看>>