【Spring MVC】WebClientでGET通信(retriveでResponseEntityを取得)

概要

retrieveメソッドを使用した、基本的なGET通信の使用方法についてまとめた。
今回は指定した型のボディを含むResponseEntityを取得する方法について紹介する。

尚、動作確認を行うための事前準備については、以下に記載している。

あわせて読みたい

概要 RESTなAPIにアクセスするのはRestTemplateではなくWebClientが今後推奨となるため、WebClientの概要についてまとめた。 WebClientを使用するための準備と、どんなメソッドがあるのかを紹介している[…]

WebClientの導入

 

基本的な使い方

getメソッドとretrieveメソッドを組み合わせることで、GETリクエストを送信してレスポンス(ResponseSpec)を取得する。
戻り値のResponseSpec#toEntityメソッドまたは#toEntityListと組み合わせることで、ResponseEntityを取得できる。

※ResponseEntityはHTTPレスポンス全体(ステータスコード・ヘッダー・ボディ)を扱うオブジェクト

 

実装方法

getメソッド/retriveメソッド/ResponseSpec#toEntityまたはtoEntityListメソッドを、以下のようにメソッドチェーンで組み合わせて使用する。

 

①指定した型のボディを含むResponseEntityを取得する場合

webClient.get() // ⇒GETリクエストの準備
.uri(URI情報) // ⇒URIを指定
.retrieve() // ⇒リクエストを送信し、レスポンスを取得
.toEntity(取得したいレスポンスの型) // ⇒レスポンスをResponseEntityで取得
.block(); // ⇒Monoを同期的に処理し、中身を取り出す

 

②指定した型のリストをボディに含むResponseEntityを取得する場合

webClient.get() // ⇒GETリクエストの準備
.uri(URI情報) // ⇒URIを指定
.retrieve() // ⇒リクエストを送信し、レスポンスを取得
.toEntityList(取得したいレスポンスの型) // ⇒レスポンスをResponseEntityで取得
.block(); // ⇒Monoを同期的に処理し、中身を取り出す

 

このように、getメソッドを呼び出したタイミングでリクエストは送信されない。
実際にリクエストを送信するのはretrieveメソッドとなる。

その後、retrieveの戻り値であるResponseSpec#toEntityまたはtoEntityListを呼び出すことで、レスポンスを非同期で扱うMonoオブジェクトとして取得する。
最後に同期処理としてblockを呼び出し、ResponseEntityを取得する。

 

使用例

APIアクセスクラスにメソッドを追加して動作確認を行う。

 

APIアクセスクラス

get + retrieve + toEntityまたはtoEntityListを使用して、GET通信を行う以下のメソッドを追加する。

①指定した型のボディを含むResponseEntityを取得する
②指定した型のリストをボディに含むResponseEntityを取得する

 

WebApiClient.java


package com.example.webclient_prototype.biz;

import java.net.URI;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.reactive.function.client.WebClient;

/**
 * WebClientを使用したAPI疎通クラス
 */
@Component
public class WebApiClient {

	@Autowired
	private WebClient webClient;
	
	/**
	 * GETリクエストを実行し、指定した型のボディを含むResponseEntityを取得する
	 * @param uri
	 * @param responseType
	 * @return
	 */
	public <T> ResponseEntity<T> getEntity(URI uri, Class<T> responseType) {
		return webClient.get()
				.uri(uri)
				.retrieve()
				.toEntity(responseType)
				.block();
	}

	/**
	 * GETリクエストを実行し、指定した型のリストをボディに含むResponseEntityを取得する
	 * @param <T>
	 * @param uri
	 * @param responseType
	 * @return
	 */
	public <T> ResponseEntity<List<T>> getEntityList(URI uri, Class<T> responseType) {
		return webClient.get()
				.uri(uri)
				.retrieve()
				.toEntityList(responseType)
				.block();
	}

}

 

public <T> ResponseEntity<T> getEntity(URI uri, Class<T> responseType) {

取得したいレスポンスの型を含むResponseEntityを取得する。

 

public <T> ResponseEntity<List<T>> getEntityList(URI uri, Class<T> responseType) {

取得したいレスポンスの型のリストを含むResponseEntityを取得する。

 

動作確認

動作確認を行う。

 

指定した型のボディを含むResponseEntityの取得

シンプルな型のボディを含むResponseEntityを取得する。

 

動作確認用クラス


// GETリクエスト
ResponseEntity<Resource> resEntity = client
		.getEntity(URI.create("http://localhost:8080/rest_prototype/rest01/1"), Resource.class);

// 動作確認
System.out.println(resEntity.getStatusCode());
System.out.println(resEntity.getHeaders());
System.out.println(resEntity.getBody());

 

ResponseEntity<Resource> resEntity = client
.getEntity(URI.create(“http://localhost:8080/rest_prototype/rest01/1”), Resource.class);

指定したURIに対してGET通信を行い、レスポンスをResponseEntityで取得している。
ResponseEntityのボディ部には、Resourceクラスを指定している。

 

コンソール


200 OK
[Content-Type:"application/json;charset=UTF-8", Transfer-Encoding:"chunked", Date:"Wed, 04 Jun 2025 23:53:51 GMT"]
Resource(id=1, name=りんご, hogeDate=2025-02-01)

 

指定した型のリストをボディに含むResponseEntityの取得

リストをボディに含むResponseEntityを取得する。

 

動作確認用クラス


// GETリクエスト
ResponseEntity<List<Resource>> resEntity = client
		.getEntityList(URI.create("http://localhost:8080/rest_prototype/rest05/"), Resource.class);

// 動作確認
System.out.println(resEntity.getStatusCode());
System.out.println(resEntity.getHeaders());
System.out.println(resEntity.getBody());

 

ResponseEntity<List<Resource>> resEntity = client
.getEntityList(URI.create(“http://localhost:8080/rest_prototype/rest05/”), Resource.class);

指定したURIに対してGET通信を行い、レスポンスをResponseEntityで取得している。
ResponseEntityのボディ部には、リスト<Resource>を指定している。

 

まとめ

 

☑ retrieveはリクエストを送信し、レスポンスとしてResponseSpecを受け取る。

☑ ResponseSpec#toEntityメソッドを使用することで、指定した型を含むResponseEntityを取得できる

☑ ResponseSpec#toEntityListメソッドを使用することで、指定した型のリストを含むResponseEntityを取得できる

 

スポンサーリンク