前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java 9对Http/2的改进

Java 9对Http/2的改进

作者头像
用户1263954
发布2018-01-30 15:19:32
1.5K0
发布2018-01-30 15:19:32
举报
文章被收录于专栏:IT技术精选文摘IT技术精选文摘

Java 9不仅专注于模块性,还有许多通过JEP进程发布的额外特性和增强。 本文主要描述对新Http2的支持.

HTTP/2 是最新版本的HTTP协议, 该版本解决了当前HTTP1.1版本中的缺陷. HTTP/2 关注于数据是如何在服务器和客户端之间形成帧并被传输的.

HTTP/2的优点

  1. 在 HTTP/1.1中, 同一时刻我们最多能打开6个连接, 所以每个请求必须等待其它请求的完成.为了避免这个问题,开发者通常需要使用一些变通的方法. 如缩小和压缩文件或图片等。HTTP/2通过多路复用来解决这个问题,即HTTP/2可在单个TCP连接上并行发送多个请求数据。
  2. 在HTTP/1.1中, 每个发送到服务器的请求头中都包含了一些额外的数据,这会增加带宽消耗。这个问题在HTTP/2.0中也被解决了,它通过将请求头打包成一个压缩块作为一个整体单元来发送,一旦发送完毕,头部块将被解码,HTTP/2使用HPack做请求头的压缩.
  3. 在HTTP/1.1中,一个HTML页面发送到浏览器后,浏览器在解析的时候需要知道哪些页面资源是需要的,然后再从服务器去获取这些所需要的资源. 这个在HTTP/2中是通过服务器推送技术来解决的,它允许服务器主动将响应推送到客户端而不是等待新的请求处理.
  4. HTTP/2.0使用二进制代替文本.
  5. HTTP/2中不再需要域名共享和资源连结.

HTTP/2.0的缺点

我们大多数都期望HTTP 2.0协议会有更多的特性, 但由于要向后兼容,许多特性并没有在最终版本中被支持

  1. 它不是特别的快.
  2. 易被攻击.
  3. HTTP/2.0 使用同HTTP/1.1一样的加密技术.
  4. HTTP/2.0 不是特别重视cookie的安全性.

HTTP/2.0在Java 9中的变化

在HTTP/1.1的时候,原先对HTTP处理的API是一个闪亮的新事物,那个时候使用同样的API可写多种非预知的不同连接。但随着时间的发展,HTTP的使用已经进化了,但遗憾地是,Java API却没有相应地跟上. 所以,在 Java 9里,一个全新的更清晰更干净的API被添加以用来支持HTTP/2.

新的API处理HTTP连接主要分三个阶段.

  1. HttpClient处理连接的创建并发送请求.
  2. HttpRequest 使用HttpClient来构造用于发送的请求.
  3. HttpResponse持有对已发送请求的响应. java.net 已经引入了HttpClient类以及HttpRequest和HttpResponse类

新的API使得维护HTTP连接更容易. 在没有第三方依赖库的情况下,它使得应用程序更快更具有响应性.

import jdk.incubator.http.*;

import java.net.URI;

import java.io.IOException;

import java.util.Map;

public class HTTP2Demo {

public static void main(String[] args) throws IOException {

try {

HttpClient httpClient = HttpClient.newHttpClient(); //Create a HttpClient

System.out.println(httpClient.version());

HttpRequest httpRequest = HttpRequest.newBuilder().uri(new URI("https://www.google.com/")).GET().build(); //Create a GET request for the given URI

Map < String, List < String >> headers = httpRequest.headers().map();

headers.forEach((k, v) - > System.out.println(k + "-" + v));

HttpResponse < String > httpResponse = httpClient.send(httpRequest, HttpResponse.BodyHandler.asString());

} catch (Exception e) {

System.out.println("message " + e);

}

}

}

在上面的例子中, 我们使用了同步的特性 (例如 httpClient.send), 即在请求完成前需要一直阻塞等待. 这通常不是我们所期望的. 所以, 通过下面这种方式我们可以让它变成异步.

CompletableFuture > httpResponse = httpClient.sendAsync(httpRequest, HttpResponse.BodyHandler.asString());

上面的代码块允许程序在发送完请求后立即可以继续做其它的任务. 返回的CompletableFuture对象可用于判断请求是否已完成并在请求完成后可对HttpResponse进行处理.

if(httpResponse.isDone()) {

System.out.println(httpResponse.get().statusCode());

System.out.println(httpResponse.get().body());

} else {

httpResponse.cancel(true);

}

上面的代码块用于检查响应是否已完成,还有一些更易处理的工具方法可使用。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-08-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 IT技术精选文摘 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档