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