3
1

More than 3 years have passed since last update.

【Java】HttpClientでコンテンツ取得

Last updated at Posted at 2020-11-02

HTTPでコンテンツ取得

  • HttpClientクラス(Java11以降)
    • HTTP2対応
    • 非同期処理
    • WebSocket通信(軽量)
  • モジュール(パッケージの束)
    • HttpClientクラスはjava.net.httpモジュールに属する
    • 現プロジェクトからモジュールへのアクセスを有効化するため/src配下に以下記述
module-info.java
module selflearn{
  requires java.net.http;
}
  • HttpClientオブジェクト生成
    • newHttpClientメソッドでインスタンス生成
    • newBuilderメソッドで動作パラメータ設定
    • 認証コード(authenticator)、接続タイムアウト時間(connectTimeout)、バージョン指定(version)など
    • var client = HttpClient.newBuilder() .version(HttpClient.Version.HTTP_1_1) .connectTimeout(Duration.parse("PT3S")).build();
    • 最後にbuild()を呼び出してそれぞれの設定に基づくHttpClientオブジェクト生成
  • HTTPRequestオブジェクト生成
    • newBuilderメソッドの最後にbuildメソッド呼び出す
  • リクエスト送信
    • HttpClientクラスのsendメソッド
    • レスポンス操作のhandlerメソッド指定
      • 文字列(ofString)、ストリーム(ofLines)、ファイル(ofFile)、入力ストリーム(ofInputStream)、バイト配列(ofByteArray)
  • レスポンス取得
    • sendメソッドは応答をオブジェクトで返す
    • 本文(body)、応答ヘッダ(headers)、HttpRequest(request)、ステータスコード(statusCode)、URI(uri)
//Qiitaにアクセスしてコンテンツ取得
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Main {
  public static void main(String[] args) {
    try {
      //HTTPクライアント生成
      var client = HttpClient.newHttpClient();
      //リクエスト準備
      var req = HttpRequest.newBuilder()
        .uri(URI.create("https://qiita.com/"))
        .build();
      //レスポンス取得
      var res = client.send(req, HttpResponse.BodyHandlers.ofString());
      System.out.println(res.body());
      //<!DOCTYPE html><html><head><meta charset="utf-8" /><title>Qiita</title><meta content="Qiitaは、プログラマのための技術情報共有サービスです。 プログラミングに関するTips、ノウハウ、メモを簡単に記録 &amp;amp; 公開することができます。"(略)
    } catch (IOException | InterruptedException e) {
      e.printStackTrace();
    }
  }
}

非同期リクエスト送信

  • sendAsyncメソッド
    • 応答を待たず後続の処理できる
    • thenAcceptメソッドで結果処理
//非同期処理でレスポンス取得
client.send(req, HttpResponse.BodyHandlers.ofString())
.thenAccept(response -> {
  System.out.println(response.body());
});

HTTP POSTのデータ通信

  • HTTP GETでデータ取得、HTTP POSTでデータ送信
  • HttpRequest.BodyPublishersクラスのメソッドでリクエスト生成
    • 文字列(ofString)、ファイル長さ(ofFile)、InputStream(ofInputStream)、バイト配列(ofByteArray)
import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;

public class Main {
  public static void main(String[] args) throws IOException, InterruptedException {
    var client = HttpClient.newHttpClient();
    //nameキーを受け取ってString生成
    var req = HttpRequest.newBuilder()
      .uri(URI.create("https://www.sample/post.php")) //"こんにちは、さん!"
      .header("Content-Type","application/json")
      .POST(HttpRequest.BodyPublishers.ofString(
         "{ \"name\" : \"Qiita Neko\" }")) 
      .build();
    var res = client.send(req, HttpResponse.BodyHandlers.ofString());
    System.out.println(res.body()); //こんにちは、Qiita Nekoさん!
  }
}
post.php
<?php
$data = json_decode(file_get_contents('php://input'));
print ('こんにちは、'.$data->name.'さん!');
3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1