JAVA 9 新特性 — HTTP2

Java 9中正式加入了对HTTP2的支持,同时对http client包进行了模块化封装,不过并没有正式加入java api,暂时放入一个临时的模块中:

requires jdk.incubator.httpclient;

所以在调用的时候会有警告:WARNING: Using incubator modules: jdk.incubator.httpclient.
在下一个java 版本中会正式加入,并且移除旧模块。

新的api调用方式十分简单,首先需要一个HttpClient,实例化方式是通过builder来实例化:

HttpClient.Builder builder = HttpClient.newBuilder()

然后是HttpRequest的实例化:

HttpRequest.Builder request = HttpRequest.newBuilder(new URI("https://www.baidu.com"));

同样也是builder模式.请求发送:

client.send(request, HttpResponse.BodyHandler.asString(Charset.forName("utf-8"))

请求返回都是返回一个HttpResponse,里面包含了常用对相应的不同处理方式。下面简单介绍一下:

  • asString 将返回数据处理成字符串。
  • asFile 可以将相应body保存为文件。
  • asFileDownload 作为文件下载;这个从源码可以看到响应头必须包含Content-Disposition和attachment。
  • asByteArray 作为字节数组;这个可以将相应保存为文件等等。
  • apply 可以根据响应状态码来返回一个BodyProcessor,自定义处理。
  • discard 忽略响应体,用自定义内容代替。

BodyHandler和BodyProcessor里都定义了对不同响应body的处理实现,对于一个基本的http client来说已经足够。来看下HttpClient.Builder的一些常用方法:

  • followRedirects 重定向设置,默认不允许重定向;
    NEVER 从不
    ALWAYS 总是
    SAME_PROTOCOL 允许相同协议重定向
    SECURE 允许安全协议重定向,不允许从https到http
  • proxy 代理;
    builder.proxy(ProxySelector.of(new InetSocketAddress(Inet4Address.getByName("127.0.0.1"), 1080)));
    
  • authenticator http验证;
    	builder.authenticator(new Authenticator() {
        @Override
        protected PasswordAuthentication getPasswordAuthentication() {
            return new PasswordAuthentication("username", "password".toCharArray());
        }
    });
    
  • priority HTTP2请求优先级 0-256,越大优先级越高;
  • executor 异步任务,请求同时也可以调用异步任务。由于传入的是Executor接口,支持的实现就比较多了,可以是ExecutorService创建的单线程或多线程任务,也可以是定时任务等等;
  • cookieManager 请求cookie的设置,可设置不接受cookie等等;

同时HttpClient和HttpRequest中都可以对http 版本进行设置,默认是HTTP2,且后者会覆盖前者的设置,如果HTTP2的响应并不是对应版本则会回退到HTTP1.1

可以看到新的http client api对常用http请求已经做了比较好的封装和修改,基本使用已经可以抛弃apache的http client工具了。

在Java 9中,还对websocket进行了支持,可以查看https://docs.oracle.com/javase/9/docs/api/jdk/incubator/http/WebSocket.html了解。

参考文档:https://docs.oracle.com/javase/9/docs/api/jdk/incubator/http/package-summary.html

版权所有丨转载请注明出处:https://minei.me/archives/302.html