Java 9不仅专注于模块性,还有许多通过JEP进程发布的额外特性和增强。 本文主要描述对新Http2的支持.
HTTP/2 是最新版本的HTTP协议, 该版本解决了当前HTTP1.1版本中的缺陷. HTTP/2 关注于数据是如何在服务器和客户端之间形成帧并被传输的.
HTTP/2的优点
HTTP/2.0的缺点
我们大多数都期望HTTP 2.0协议会有更多的特性, 但由于要向后兼容,许多特性并没有在最终版本中被支持
HTTP/2.0在Java 9中的变化
在HTTP/1.1的时候,原先对HTTP处理的API是一个闪亮的新事物,那个时候使用同样的API可写多种非预知的不同连接。但随着时间的发展,HTTP的使用已经进化了,但遗憾地是,Java API却没有相应地跟上. 所以,在 Java 9里,一个全新的更清晰更干净的API被添加以用来支持HTTP/2.
新的API处理HTTP连接主要分三个阶段.
新的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);
}
上面的代码块用于检查响应是否已完成,还有一些更易处理的工具方法可使用。