国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

java9系列(六)HTTP/2 Client (Incubator)

tomlingtm / 2733人閱讀

摘要:鑒于它還處在,如果不是著急使用,建議還是使用的,它是遵循規范的,使用起來更加方便。貌似要在版本才支持。揭秘讓支持協議如何啟用命令支持

本文主要研究下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();
        HttpResponse httpResponse = 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.(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
async get
    @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();

        CompletableFuture> 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();
    }
post form
    @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 ; includeSubDomains
HTTP/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。

doc

JDK 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

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/68672.html

相關文章

  • Java9的新特性

    摘要:新特性概述系列一安裝及使用系列二運行系列三模塊系統精要系列四更新系列五系列六系列七系列八系列九與的區別遷移注意事項參數遷移相關選項解析使用構建實例使用示例帶你提前了解中的新特性 Java語言特性系列 Java5的新特性 Java6的新特性 Java7的新特性 Java8的新特性 Java9的新特性 Java10的新特性 Java11的新特性 Java12的新特性 Java13的新特性...

    ddongjian0000 評論0 收藏0
  • Java11的新特性

    摘要:從版本開始,不再單獨發布或者版本了,有需要的可以自己通過去定制官方解讀官方細項解讀穩步推進系列六的小試牛刀一文讀懂的為何如此高效棄用引擎 Java語言特性系列 Java5的新特性 Java6的新特性 Java7的新特性 Java8的新特性 Java9的新特性 Java10的新特性 Java11的新特性 Java12的新特性 Java13的新特性 序 本文主要講述一下Java11的新...

    April 評論0 收藏0
  • Java11 HttpClient小試牛刀

    序 本文主要研究一下Java11的HttpClient的基本使用。 變化 從java9的jdk.incubator.httpclient模塊遷移到java.net.http模塊,包名由jdk.incubator.http改為java.net.http 原來的諸如HttpResponse.BodyHandler.asString()方法變更為HttpResponse.BodyHandlers.of...

    Bmob 評論0 收藏0
  • Java9模塊化學習筆記一之快速入門

    摘要:如果你想查看運行時模塊的加載過程輸出結果表示為模塊,由于我限制了不再往下輸出了,而我們模塊又沒有別的額外依賴,所以僅有這行輸出。 jdk9模塊快速入門 列出自帶模塊:java --list-modulesmac多版本jdk共存:http://adolphor.com/blog/2016...模塊規則示意圖:showImg(https://segmentfault.com/img/bVb...

    cjie 評論0 收藏0
  • JAVA9-12新特性簡述

    摘要:本文是個人在企業內部分享使用的簡要大綱,列舉了的重要更新,文章的結構較簡單,也不規范,鑒于近期寫若干文章時總會忘記一些新特性所處的版本,特將此大綱流留用。 本文是個人在企業內部分享使用的簡要大綱,列舉了JAVA9-12的重要更新,文章的結構較簡單,也不規范,鑒于近期寫若干文章時總會忘記一些新特性所處的版本,特將此大綱流copy留用。 一 JAVA9 新特性 1.Java Platfo...

    TigerChain 評論0 收藏0

發表評論

0條評論

tomlingtm

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<