摘要:鉴于它还处在,如果不是着急使用,建议还是使用的,它是遵循规范的,使用起来更加方便。貌似要在版本才支持。揭秘让支持协议如何启用命令支持
序
本文主要研究下JEP 110: HTTP/2 Client (Incubator)
基本实例 sync get/** * --add-modules jdk.incubator.httpclient * @throws IOException * @throws InterruptedException * @throws URISyntaxException */ @Test public void testGet() throws IOException, InterruptedException, URISyntaxException { HttpClient httpClient = HttpClient.newHttpClient(); HttpRequest httpRequest = HttpRequest.newBuilder() .uri(new URI("https://www.baidu.com")) .header("User-Agent", "jdk 9 http client") .GET() .build(); HttpResponsehttpResponse = httpClient.send(httpRequest, HttpResponse.BodyHandler.asString()); System.out.println(httpResponse.statusCode()); System.out.println(httpResponse.body()); }
由于jdk9模块化了,junit这里没有模块化,需要在javac编译时添加--add-modules jdk.incubator.httpclient,否则报错如下:
Error:(3, 21) java: 程序包 jdk.incubator.http 不可见 (程序包 jdk.incubator.http 已在模块 jdk.incubator.httpclient 中声明, 但该模块不在模块图中)
在java运行时也要添加--add-modules jdk.incubator.httpclient,否则报NoClassDefFoundError
java.lang.NoClassDefFoundError: jdk/incubator/http/HttpResponse at java.base/java.lang.Class.getDeclaredMethods0(Native Method) at java.base/java.lang.Class.privateGetDeclaredMethods(Class.java:3139) at java.base/java.lang.Class.getDeclaredMethods(Class.java:2266) at org.junit.internal.MethodSorter.getDeclaredMethods(MethodSorter.java:54) at org.junit.runners.model.TestClass.scanAnnotatedMembers(TestClass.java:65) at org.junit.runners.model.TestClass.async get(TestClass.java:57) at org.junit.runners.ParentRunner.createTestClass(ParentRunner.java:88) at org.junit.runners.ParentRunner. (ParentRunner.java:83) at org.junit.runners.BlockJUnit4ClassRunner. (BlockJUnit4ClassRunner.java:65) at org.junit.internal.builders.JUnit4Builder.runnerForClass(JUnit4Builder.java:10) at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59) at org.junit.internal.builders.AllDefaultPossibilitiesBuilder.runnerForClass(AllDefaultPossibilitiesBuilder.java:26) at org.junit.runners.model.RunnerBuilder.safeRunnerForClass(RunnerBuilder.java:59) at org.junit.internal.requests.ClassRequest.getRunner(ClassRequest.java:33) at org.junit.internal.requests.FilterRequest.getRunner(FilterRequest.java:36) at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:49) at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47) at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242) at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70) Caused by: java.lang.ClassNotFoundException: jdk.incubator.http.HttpResponse at java.base/jdk.internal.loader.BuiltinClassLoader.loadClass(BuiltinClassLoader.java:582) at java.base/jdk.internal.loader.ClassLoaders$AppClassLoader.loadClass(ClassLoaders.java:185) at java.base/java.lang.ClassLoader.loadClass(ClassLoader.java:496) ... 19 more
@Test public void testAsyncGet() throws URISyntaxException, InterruptedException, ExecutionException { HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(new URI("https://www.baidu.com")) .GET() .build(); CompletableFuturepost form> response = client.sendAsync(request, HttpResponse.BodyHandler.asString()); response.whenComplete((resp,t) -> { if(t != null){ t.printStackTrace(); }else{ System.out.println(resp.body()); System.out.println(resp.statusCode()); } }).join(); }
@Test public void testPostForm() throws URISyntaxException { HttpClient client = HttpClient.newHttpClient(); HttpRequest request = HttpRequest.newBuilder() .uri(new URI("http://www.w3school.com.cn/demo/demo_form.asp")) .header("Content-Type","application/x-www-form-urlencoded") .POST(HttpRequest.BodyProcessor.fromString("name1=value1&name2=value2")) .build(); client.sendAsync(request, HttpResponse.BodyHandler.asString()) .whenComplete((resp,t) -> { if(t != null){ t.printStackTrace(); }else{ System.out.println(resp.body()); System.out.println(resp.statusCode()); } }).join(); }HTTP/2 curl http2
安装
brew install curl --with-nghttp2 ==> Installing dependencies for curl: jemalloc, nghttp2 ==> Installing curl dependency: jemalloc ==> Downloading https://homebrew.bintray.com/bottles/jemalloc-5.0.1.sierra.bottl ######################################################################## 100.0% ==> Pouring jemalloc-5.0.1.sierra.bottle.tar.gz ? /usr/local/Cellar/jemalloc/5.0.1: 16 files, 1.6MB ==> Installing curl dependency: nghttp2 ==> Downloading https://homebrew.bintray.com/bottles/nghttp2-1.31.0.sierra.bottl ######################################################################## 100.0% ==> Pouring nghttp2-1.31.0.sierra.bottle.tar.gz ? /usr/local/Cellar/nghttp2/1.31.0: 33 files, 6.3MB ==> Installing curl --with-nghttp2 ==> Downloading https://curl.haxx.se/download/curl-7.58.0.tar.bz2 ######################################################################## 100.0% ==> ./configure --disable-silent-rules --prefix=/usr/local/Cellar/curl/7.58.0 -- ==> make install ==> Caveats This formula is keg-only, which means it was not symlinked into /usr/local, because macOS already provides this software and installing another version in parallel can cause all kinds of trouble. If you need to have this software first in your PATH run: echo "export PATH="/usr/local/opt/curl/bin:$PATH"" >> ~/.zshrc For compilers to find this software you may need to set: LDFLAGS: -L/usr/local/opt/curl/lib CPPFLAGS: -I/usr/local/opt/curl/include For pkg-config to find this software you may need to set: PKG_CONFIG_PATH: /usr/local/opt/curl/lib/pkgconfig ==> Summary ? /usr/local/Cellar/curl/7.58.0: 415 files, 3MB, built in 2 minutes 37 seconds
检查
curl -V curl 7.58.0 (x86_64-apple-darwin16.7.0) libcurl/7.58.0 OpenSSL/1.0.2n zlib/1.2.8 nghttp2/1.31.0 Release-Date: 2018-01-24 Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp smb smbs smtp smtps telnet tftp Features: AsynchDNS IPv6 Largefile NTLM NTLM_WB SSL libz TLS-SRP HTTP2 UnixSockets HTTPS-proxy
访问
curl -I --http2 https://http2.akamai.com/demo HTTP/2 200 server: Apache etag: "07ce30bc53aa7834dff55f92a6d05a56:1466062139" last-modified: Thu, 16 Jun 2016 07:28:59 GMT accept-ranges: bytes content-length: 2421 content-type: text/html rtt: 186 ghost_ip: 23.193.143.145 ghost_service_ip: 107.14.44.207 client_real_ip: 210.21.215.42 client_ip: 210.21.215.42 myproto: h2 protocol_negotiation: h2 expires: Mon, 05 Mar 2018 01:15:17 GMT cache-control: max-age=0, no-cache, no-store pragma: no-cache date: Mon, 05 Mar 2018 01:15:17 GMT accept-ch: DPR, Width, Viewport-Width, Downlink, Save-Data access-control-max-age: 86400 access-control-allow-credentials: false access-control-allow-headers: * access-control-allow-methods: GET,HEAD,POST access-control-allow-origin: * strict-transport-security: max-age=31536000 ; includeSubDomainsHTTP/2实例
@Test public void testHttp2() throws URISyntaxException, IOException, InterruptedException { HttpClient.newBuilder() .followRedirects(HttpClient.Redirect.SECURE) .version(HttpClient.Version.HTTP_2) .build() .sendAsync(HttpRequest.newBuilder() .uri(new URI("https://http2.akamai.com/demo")) .GET() .build(), HttpResponse.BodyHandler.asString()) .whenComplete((resp,t) -> { if(t != null){ t.printStackTrace(); }else{ System.out.println(resp.body()); System.out.println(resp.statusCode()); } }).join(); }小结
jdk9的httpclient现在还在incubator中,最大的特性便是支持HTTP/2,当然也优化了httpclient的api,同时也支持了异步模式。鉴于它还处在incubator,如果不是着急使用HTTP/2,建议还是使用spring5的webclient,它是遵循reactive-streams规范的,使用起来更加方便。reactor-netty貌似要在0.9.0.RELEASE版本才支持HTTP/2。
docJDK 9 features
Getting Started With Java 9"s New HTTP Client
Java 9: The New HttpClient
Java 9 揭秘(14. HTTP/2 Client API)
让 curl 支持 HTTP/2 协议
如何启用curl命令HTTP2支持
Add Http2 support #104
Java 9: High level HTTP and WebSocket API
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/68672.html
摘要:新特性概述系列一安装及使用系列二运行系列三模块系统精要系列四更新系列五系列六系列七系列八系列九与的区别迁移注意事项参数迁移相关选项解析使用构建实例使用示例带你提前了解中的新特性 Java语言特性系列 Java5的新特性 Java6的新特性 Java7的新特性 Java8的新特性 Java9的新特性 Java10的新特性 Java11的新特性 Java12的新特性 Java13的新特性...
摘要:从版本开始,不再单独发布或者版本了,有需要的可以自己通过去定制官方解读官方细项解读稳步推进系列六的小试牛刀一文读懂的为何如此高效弃用引擎 Java语言特性系列 Java5的新特性 Java6的新特性 Java7的新特性 Java8的新特性 Java9的新特性 Java10的新特性 Java11的新特性 Java12的新特性 Java13的新特性 序 本文主要讲述一下Java11的新...
序 本文主要研究一下Java11的HttpClient的基本使用。 变化 从java9的jdk.incubator.httpclient模块迁移到java.net.http模块,包名由jdk.incubator.http改为java.net.http 原来的诸如HttpResponse.BodyHandler.asString()方法变更为HttpResponse.BodyHandlers.of...
摘要:如果你想查看运行时模块的加载过程输出结果表示为模块,由于我限制了不再往下输出了,而我们模块又没有别的额外依赖,所以仅有这行输出。 jdk9模块快速入门 列出自带模块:java --list-modulesmac多版本jdk共存:http://adolphor.com/blog/2016...模块规则示意图:showImg(https://segmentfault.com/img/bVb...
摘要:本文是个人在企业内部分享使用的简要大纲,列举了的重要更新,文章的结构较简单,也不规范,鉴于近期写若干文章时总会忘记一些新特性所处的版本,特将此大纲流留用。 本文是个人在企业内部分享使用的简要大纲,列举了JAVA9-12的重要更新,文章的结构较简单,也不规范,鉴于近期写若干文章时总会忘记一些新特性所处的版本,特将此大纲流copy留用。 一 JAVA9 新特性 1.Java Platfo...
阅读 2048·2021-11-19 09:58
阅读 1677·2021-11-15 11:36
阅读 2845·2019-08-30 15:54
阅读 3353·2019-08-29 15:07
阅读 2745·2019-08-26 11:47
阅读 2719·2019-08-26 10:11
阅读 2475·2019-08-23 18:22
阅读 2722·2019-08-23 17:58