HTTP Client API在Java 9被引入,在Java 10进行了更新,不过一直处于孵化状态,在此次Java 11中获得正式发布,包名由jdk.incubator.http改为java.net.http。HTTP Client API实现了HTTP(1.1和2)和WebSocket,用来取代遗留的java.net.HttpURLConnection。该API用来在Java程序中作为客户端请求HTTP服务,Java中服务端HTTP的支持由Servlet实现。
现有的HttpURLConnection API存在许多问题:
基本的URLConnection被设计为支持多种协议,很多协议已经过时不用了。该API早于HTTP/1.1发布,而且过于抽象。使用困难,包含很多没有文档说明的行为。只支持阻塞模式。维护困难。
除了HttpURLConnection,还有一些其他的HTTP客户端API和实现类库,比如Apache的HttpComponents(HttpClient)和Jetty等等,但是它们过于重量了,而且没有利用新的Java语言特性如Lambda表达式。
HTTP Client API内部实现上,通过java.util.concurrent.CompletableFuture来支持非阻塞请求和响应,由Java平台的响应式流(Reactive Streams)支持java.util.concurrent.Flow API来实现请求和响应的背压(back-pressure)和流量控制(flow-control)。利用响应式流RX Flow的概念,避免了为支持HTTP/2而创造过多概念。
HTTP Client API的主要类包括:
java.net.http.HttpClientjava.net.http.HttpRequestjava.net.http.HttpResponsejava.net.http.WebSocket
HTTP Client API特性:
对大多数场景提供简单易用的阻塞模型。通过异步机制支持事件通知。完整支持HTTP协议的特性。易于建立WebSocket握手。支持HTTP/2,包括协议升级(Upgrade)和服务端推送(server push)。支持 HTTPS/TLS。和现有的其他实现类库相比,性能相当或有提升,内存占用少。