【Spring MVC】WebClientでGET通信(retriveでレスポンスボディ取得)

概要

retrieveメソッドを使用した、基本的なGET通信の使用方法についてまとめた。
今回はレスポンスボディのみを取得する方法について紹介する。

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

あわせて読みたい

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

WebClientの導入

 

基本的な使い方

retrieveメソッドは、HTTPリクエストを送信してレスポンス(ResponseSpec)を取得するメソッドとなる。
get, post, put, deleteなどのHTTPメソッドと組み合わせて使用する。

戻り値のResponseSpec#bodyToMonoメソッドと組み合わせることで、レスポンスボディのみを取得できる。

 

実装方法

getメソッド/retriveメソッド/ResponseSpec#bodyToMonoメソッドを、以下のようにメソッドチェーンで組み合わせて使用する。
※都度戻り値を取得することもできるが、メソッドチェーンで完結できるよう設計されている

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

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

その後、retrieveの戻り値であるResponseSpec#bodyToMonoを呼び出すことで、レスポンスボディを非同期で扱うMonoオブジェクトとして取得する。
最後に同期処理としてblockを呼び出し、指定した型のレスポンスボディを取得する。

 

使用例

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

 

APIアクセスクラス

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

①単純な型のレスポンスを取得する
②コレクションやジェネリック型を含むレスポンスを取得する

 

WebApiClient.java


package com.example.webclient_prototype.biz;

import java.net.URI;

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

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

	@Autowired
	private WebClient webClient;
	
	/**
	 * ①単純な型のレスポンスを取得する
	 * GETリクエストを行ない、レスポンスボディを指定した型で取得
	 * @param uri
	 * @param responseType
	 * @return
	 */
	public <T> T getBody(URI uri, Class<T> responseType) {
		return webClient.get()
				.uri(uri)
				.retrieve()
				.bodyToMono(responseType)
				.block();
	}
	
	/**
	 * ②コレクションやジェネリック型を含むレスポンスを取得する
	 * GETリクエストを行ない、レスポンスボディを指定した型で取得(ジェネリクスを含む)
	 * ParameterizedTypeReferenceを渡すと、戻り値は引数で指定したTとなる
	 * @param uri
	 * @param responseType
	 * @return
	 */
	public <T> T getBody(URI uri, ParameterizedTypeReference<T> responseType) {
		return webClient.get()
				.uri(uri)
				.retrieve()
				.bodyToMono(responseType)
				.block();
	}
}

 

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

シンプルなオブジェクトをレスポンスの型に指定している。

 

public <T> T getBody(URI uri, ParameterizedTypeReference<T> responseType) {

ジェネリクスを含むオブジェクトをレスポンスの型に指定している。

 

動作確認

動作確認を行う。

 

文字列

戻り値にStringを指定する。

 

動作確認用クラス


// GETリクエスト
String resStr = client.getBody(URI.create("http://localhost:8080/rest_prototype/rest01/1"), String.class);

// 動作確認
System.out.println(resStr);

 

String resStr = client.getBody(URI.create(“http://localhost:8080/rest_prototype/rest01/1”), String.class);

指定したURIに対してGET通信を行い、レスポンスボディを文字列で取得している。

 

コンソール


{"id":"1","name":"りんご","hogeDate":"2025-02-01"}

 

オブジェクト

戻り値にResourceクラスを指定する。

 

動作確認用クラス


// GETリクエスト
Resource resObj = client.getBody(URI.create("http://localhost:8080/rest_prototype/rest01/1"), Resource.class);

// 動作確認
System.out.println(resObj);

 

Resource resObj = client.getBody(URI.create(“http://localhost:8080/rest_prototype/rest01/1”), Resource.class);

指定したURIに対してGET通信を行い、レスポンスボディをオブジェクトで取得している。

 

コンソール


Resource(id=1, name=りんご, hogeDate=2025-02-01)

 

リスト

戻り値にリストを指定する。

 

動作確認用クラス


// GETリクエスト
List<Resource> resList = client.getBody(URI.create("http://localhost:8080/rest_prototype/rest05/"),
		new ParameterizedTypeReference<List<Resource>>() {});

// 動作確認
resList.forEach(r -> System.out.println(r));

 

List<Resource> resList = client.getBody(URI.create(“http://localhost:8080/rest_prototype/rest05/”),
new ParameterizedTypeReference<List<Resource>>() {});

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

 

コンソール


Resource(id=1, name=りんご, hogeDate=2025-02-01)
Resource(id=2, name=ごりら, hogeDate=2024-06-05)
Resource(id=3, name=らっぱ, hogeDate=2023-05-10)

 

 

まとめ

 

☑ retrieveはリクエストを送信するメソッドとなる

☑ リクエスト送信後の戻り値であるResponseSpec#bodyToMonoを使用して、レスポンスボディをMonoオブジェクトで取得する

☑ Mono#blockを使用して、同期的にレスポンスボディのみを取得できる

スポンサーリンク