JavaでHTTP応答本文を文字列として読み取る
1. 序章
このチュートリアルでは、JavaでHTTP応答本文を文字列として読み取るためのいくつかのライブラリについて説明します。 最初のバージョン以降、Javaは HttpURLConnectionAPIを提供してきました。 これには基本的な機能のみが含まれ、あまりユーザーフレンドリーではないことで知られています。
JDK 11で、JavaはHTTP通信を処理するために新しく改良された HttpClientAPIを導入しました。 これらのライブラリについて説明し、 ApacheHttpClientやSpringRestTemplateなどの代替ライブラリを確認します。
2. HttpClient
前述したように、HttpClientがJava11に追加されました。 これにより、ネットワークを介してリソースにアクセスできます。 ただし、 HttpURLConnection とは異なり、HttpClientはHTTP/1.1およびHTTP/2をサポートします。 さらに、は同期と非同期の両方の要求タイプを提供します。
HttpClient は、多くの柔軟性と強力な機能を備えた最新のAPIを提供します。 主に、このAPIは、 HttpClient 、 HttpRequest 、およびHttpResponseの3つのコアクラスで構成されています。
HttpResponse は、HttpRequest呼び出しの結果を示します。 HttpResponseは直接作成されず、本文が完全に受信されたときに使用可能になります。
応答本文をString、として読み取るには、最初に単純なクライアントと要求オブジェクトを作成する必要があります。
HttpClient client = HttpClient.newHttpClient();
HttpRequest request = HttpRequest.newBuilder()
.uri(URI.create(DUMMY_URL))
.build();
次に、 BodyHandlers を使用し、メソッド ofString()を呼び出して応答を返します。
HttpResponse response = client.send(request, HttpResponse.BodyHandlers.ofString());
3. HttpURLConnection
HttpURLConnection は、HTTPまたはHTTPSプロトコルを介してリソースにアクセスするために使用される軽量のHTTPクライアントであり、InputStreamを作成できます。 InputStream、を取得すると、通常のローカルファイルのように読み取ることができます。
Javaでは、インターネットにアクセスできる主なクラスは、java.net.URLクラスとjava.net.HttpURLConnectionクラスです。 まず、URLクラスを使用してWebリソースをポイントします。 次に、HttpURLConnectionクラスを使用してアクセスできます。
URLからStringとして応答本文を取得するには、最初にURLを使用してHttpURLConnectionを作成する必要があります。
HttpURLConnection connection = (HttpURLConnection) new URL(DUMMY_URL).openConnection();
新しいURL(DUMMY_URL).openConnection()は、HttpURLConnectionを返します。 このオブジェクトを使用すると、ヘッダーを追加したり、応答コードを確認したりできます。
次に、接続オブジェクトからInputStreamを取得しましょう。
InputStream inputStream = connection.getInputStream();
最後に、InputStreamをStringに変換する必要があります。
4. Apache HttpClient
このセクションでは、 ApacheHttpClientを使用してHTTP応答本文を文字列として読み取る方法を説明します。
このライブラリを使用するには、その依存関係をMavenプロジェクトに追加する必要があります。
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.12</version>
</dependency>
CloseableHttpClientクラスを介してデータを取得および送信できます。 デフォルト構成でインスタンスを作成するには、 HttpClients.createDefault()を使用できます。
CloseableHttpClient は、データを送受信するためのexecuteメソッドを提供します。 このメソッドは、タイプ HttpUriRequest のパラメーターを使用します。このパラメーターには、HttpGetやHttpPostなどの多くのサブクラスがあります。
最初にHttpGetオブジェクトを作成しましょう:
HttpGet request = new HttpGet(DUMMY_URL);
次に、クライアントを作成しましょう。
CloseableHttpClient client = HttpClients.createDefault();
3番目に、executeメソッドの結果から応答オブジェクトを取得します。
CloseableHttpResponse response = client.execute(request);
最後に、応答エンティティを文字列に変換して応答本文を返します。
HttpEntity entity = response.getEntity();
String result = EntityUtils.toString(entity);
5. 春RestTemplate
このセクションでは、 SpringRestTemplateを使用してHTTP応答本文を文字列として読み取る方法を説明します。 RestTemplateが非推奨になったことに注意する必要があります:次の章で説明するように、SpringWebClientの使用を検討する必要があります。
RestTemplate クラスは、Springが提供する重要なツールであり、JDK HttpURLConnectionなどの基盤となるHTTPクライアントライブラリに対してクライアント側のHTTP操作を行うためのシンプルなテンプレートを提供します。 、Apache HttpClient 、その他。
RestTemplate は、HTTP要求を作成して応答を処理するためのいくつかの便利なメソッドを提供します。
このライブラリを使用するには、最初にMavenプロジェクトにいくつかの依存関係を追加します。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>${spring-boot.version}</version>
<scope>test</scope>
</dependency>
Webリクエストを作成し、レスポンスの本文を文字列として返すには、最初にRestTemplateのインスタンスを作成しましょう。
RestTemplate restTemplate = new RestTemplate();
次に、メソッドgetForObject()を呼び出し、URLと目的の応答タイプを渡して応答オブジェクトを取得します—この例ではString.classを使用します。
String response = restTemplate.getForObject(DUMMY_URL, String.class);
6. Spring WebClient
最後に、 Spring WebClient、 Spring RestTemplate。に代わるリアクティブなノンブロッキングソリューションの使用方法を説明します。
このライブラリを使用するには、最初にspring-boot-starter-webflux依存関係をMavenプロジェクトに追加します。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
HTTP Getリクエストを実行する最も簡単な方法は、createメソッドを使用することです。
WebClient webClient = WebClient.create(DUMMY_URL);
HTTP Getリクエストを実行する最も簡単な方法は、getおよびretrieveメソッドを呼び出すことです。 次に、bodyToMonoメソッドとString.class type を使用して、本文を単一のStringインスタンスとして抽出します。
Mono<String> body = webClient.get().retrieve().bodyToMono(String.class);
最後に、 blockメソッドを呼び出して、ボディストリーム全体が読み取られ、文字列の結果にコピーされるまで待機するようにWebフラックスに指示しましょう。
String s = body.block();
7. 結論
この記事では、HTTP応答本文をStringとして読み取るためにいくつかのライブラリを使用する方法を見てきました。
いつものように、完全なコードはGitHubでから入手できます。