Java 9 HTTP 2.0 API入門と実践

6300 ワード

簡単に述べる
Java言語を使ってHTTPリソースを要求すると、様々な解決策があるかもしれません。最終的には合理的な方法でこの目的を達成するかもしれません。良いニュース、良いニュース、黄鶴はおばさんを連れて帰ってきて、皮革の工場は救いました:Java 9はモジュール化の特性がある以外、また全く新しいHTTPクライアントAPIを付け加えました。HTTP 2.0だけでなく、親和性のあるAPIも提供しています。SOさん、おばさんの神秘的なレースのベールをはがしましょう。
HTTP 2.0は何ですか?
HTTP 2.0は身振り手振りの新しい特性を持ってきました。
  • バイナリサブフレーム
  • 要求/応答パイプライン化
  • 非同期接続
  • 多重化
  • サーバプッシュフロー
  • TCPに基づく長い接続
  • ヘッダ圧縮
  • http/2の最大の特徴は多重化を使用して、同じドメインのサーバに対しては一回のTCP接続だけを確立し、複数のリソースをロードし、バイナリフレームを使って転送し、httpヘッダを圧縮することです。このように、ふくよかなHTTP 2.0を見ました。
    インキュベータモジュール
    ここで注意したいのは、Java 9におけるHTTPクライアントの構築は、Incubatorモジュール、and moreに依存する必要があることである。
  • はJDK 9にあります。このモジュールはjdk.incubator.httpclient
  • といいます。
  • incubatorモジュールはJDK 10でjava.httpclientに取って代わられます。
  • JDK 10はこの方面で重大な突破を迎えます。
    Java 9のHTTPクライアントAPI
    基本的に、HTTPで通信すると、HttpRequestを送信したり、HttpResonseを受信したりするための3つのクラスに関連します。このAPIはまだ分かりやすいです。right?Let’s see:基本例:GET要求、文字列を返します。
    HttpClient client = HttpClient.newHttpClient();
    
    HttpRequest request = HttpRequest.newBuilder()
        .uri(new URI("https://labs.consol.de/"))
        .build();
    
    HttpResponse response = client.send(request, HttpResponse.BodyHandler.asString());
    
    System.out.println(response.statusCode());
    System.out.println(response.body());
    
    優雅ですよね?InputStreamとReaderが関与しておらず、−転送はBodyHandlerによって直接応答から文字列を取得する。以下、BodyHandlersを紹介する。HttpClient、HttpRequest、そしてHttpResonseはHTTP 2.0通信の主要参加者ですが、やはりBuiderと協力して使用します。Buiderは分かりやすいAPIのセットを提供します。
    HttpRequest.Buider
    HttpRequest.newBuiderを呼び出して、最初の例のようにHttpRequest.Buiderの例を取得することができます。これを使用して、特定の要求に関連するすべてのコンテンツを構成します。以下はソースコードです。
    // HttpRequest.Builder
    public abstract static class Builder {
        // note: some methods left out for the sake of brevity
        public abstract Builder uri(URI uri);
        public abstract Builder version(HttpClient.Version version);
        public abstract Builder header(String name, String value);
        public abstract Builder timeout(Duration duration);
        public abstract Builder GET();
        public abstract Builder POST(BodyProcessor body);
        public abstract Builder PUT(BodyProcessor body);
        public abstract Builder DELETE(BodyProcessor body);
        public abstract HttpRequest build();
    }
    
    可読性がいい(自己解釈型)、ライト?要求されたコンテンツの構成を完了するためにチェーン方式で呼び出し、その後、HttpRequestのインスタンスを取得するためにbuild()を呼び出します。
    Http Client.Buider
    HttpRequestと同様に、Http Clint.newBurderを呼び出してHttp Client.Buiderの例を取得します。それはAPIを提供して、私たちの接続に関するより一般的なものを構成します。以下はソースコードです。
    // HttpClient.Builder
    public abstract static class Builder {
        public abstract Builder cookieManager(CookieManager cookieManager);
        public abstract Builder sslContext(SSLContext sslContext);
        public abstract Builder sslParameters(SSLParameters sslParameters);
        public abstract Builder executor(Executor executor);
        public abstract Builder followRedirects(Redirect policy);
        public abstract Builder version(HttpClient.Version version);
        public abstract Builder priority(int priority);
        public abstract Builder proxy(ProxySelector selector);
        public abstract Builder authenticator(Authenticator a);
        public abstract HttpClient build();
    }
    
    真っ白ですね。自己解釈性の良いヘルプIDEはあなたの目的をより良く達成することができます。
    より多くのJava 9 HTTPクライアントアプリケーションの例
    このような明るい未来のAPIを上記で見ました。その応用例についてもっと見てみましょう。
    1.GET要求をファイルに保存する
    HttpClient client = HttpClient.newHttpClient();
    
    HttpRequest request = HttpRequest.newBuilder()
        .uri(new URI("https://labs.consol.de/"))
        .GET()
        .build();
    
    Path tempFile = Files.createTempFile("consol-labs-home", ".html");
    HttpResponse response = client.send(request, HttpResponse.BodyHandler.asFile(tempFile));
    System.out.println(response.statusCode());
    System.out.println(response.body());
    
    2.POSTでファイルをアップロードする
    POSTでローカルファイルをアップロードするのも簡単になりました。HttpRequest.BodyProcessorを使います。
    HttpClient client = HttpClient.newHttpClient();
    
    HttpRequest request = HttpRequest.newBuilder()
        .uri(new URI("http://localhost:8080/upload/"))
        .POST(HttpRequest.BodyProcessor.fromFile(Paths.get("/tmp/file-to-upload.txt")))
        .build();
    
    HttpResponse response = client.send(request, HttpResponse.BodyHandler.discard(null));
    System.out.println(response.statusCode());
    
    3.非同期HTTP要求
    非同期HTTP要求も簡単になり、HttpClient_Async()によってHttp Cliennt_茏sendの代わりになります。サービスがサポートされれば、実行中の要求をキャンセルすることもできます。
    HttpClient client = HttpClient.newHttpClient();
    
    HttpRequest request = HttpRequest.newBuilder()
        .uri(new URI("https://labs.consol.de/"))
        .GET()
        .build();
    
    CompletableFuture> response = client.sendAsync(request, HttpResponse.BodyHandler.asString());
    
    Thread.sleep(5000);
    if(response.isDone()) {
        System.out.println(response.get().statusCode());
        System.out.println(response.get().body());
    } else {
        response.cancel(true);
        System.out.println("Request took more than 5 seconds... cancelling.");
    }
    
    4.システムエージェント設定を使用する
    HttpClient client = HttpClient.newBuilder()
     
         .proxy(ProxySelector.getDefault())
         .build();
    
     HttpRequest request = HttpRequest.newBuilder()
         .uri(new URI("https://labs.consol.de"))
         .GET()
         .build();
    
    HttpResponse response = client.send(request, HttpResponse.BodyHandler.asString());
     System.out.println(response.statusCode());
     System.out.println(response.body());
    
    5.基本認証Baic Authentication
    HttpClient client = HttpClient.newBuilder()
        .authenticator(new Authenticator() {
            @Override
            protected PasswordAuthentication getPasswordAuthentication() {
                return new PasswordAuthentication("username", "password".toCharArray());
            }
        })
        .build();
    
    HttpRequest request = HttpRequest.newBuilder()
        .uri(new URI("https://labs.consol.de"))
        .GET()
        .build();
    
    HttpResponse response = client.send(request, HttpResponse.BodyHandler.asString());
    System.out.println(response.statusCode());
    System.out.println(response.body());
    
    結論
    上記の例は、Java 9の標準APIを使用してHTTP要求を送信するのがより簡単であることを示している。さらに、応答を優雅に処理することができます。もちろん、いくつかの3つのパッケージのような喜びの機能がありますが、一般的には、クリーンなオープンボックスを選択する必要があります。英語のテキスト