概要
exchangeToMonoメソッドを使用した、基本的なGET通信の使用方法についてまとめた。
今回はレスポンスボディのみを取得する方法について紹介する。
尚、動作確認を行うための事前準備については、以下に記載している。
概要 RESTなAPIにアクセスするのはRestTemplateではなくWebClientが今後推奨となるため、WebClientの概要についてまとめた。 WebClientを使用するための準備と、どんなメソッドがあるのかを紹介している[…]
基本的な使い方
exchangeToMonoは、HTTPリクエストを送信してレスポンスからMonoオブジェクトを取得するためのメソッドとなる。
通常はget,post,put,deleteなどのHTTPメソッドと組み合わせて使用する。
exchangeToMonoの引数内でClientResponseを受け取り、レスポンスボディのみをMonoで取得する方法について解説する。
実装方法
getメソッド/exchangeToMonoメソッド/ClientResponseのメソッドを、以下のようにメソッドチェーンで組み合わせて使用する。
①レスポンスボディを指定した型で取得する場合
.uri(URI情報) // ⇒URIを指定
.exchangeToMono(res -> res.bodyToMono(指定の型)) // ⇒引数のClientResponseから、ボディを指定した型でMonoとして取り出す
.block(); // ⇒Monoを同期的に処理し、ボディの中身を取り出す
②レスポンスボディを指定した型のリストで取得する場合
.uri(URI情報) // ⇒URIを指定
.exchangeToMono(res -> res.bodyToFlux(指定の型).collectList()) // ⇒引数のClientResponseから、ボディを指定した型のリストでMonoとして取り出す
.block(); // ⇒Monoを同期的に処理し、ボディの中身を取り出す
このようにexchangeToMonoはリクエスト送信後、レスポンスをClientResponseとして引数で受け取り、その中でボディの処理などを扱うことができる。
使用例
APIアクセスクラスにメソッドを追加して動作確認を行う。
APIアクセスクラス
get + exchangeToMono + ClientResponse#bodyToMonoを使用して、GET通信を行う以下のメソッドを追加する。
②レスポンスボディを指定した型のリストで取得
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.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)
.exchangeToMono(res -> res.bodyToMono(responseType))
.block();
}
/**
* GETリクエストを行ない、レスポンスボディを指定した型のリストで取得
* @param uri
* @param responseType
* @return
*/
public <T> List<T> getBodyList(URI uri, Class<T> responseType) {
return webClient.get()
.uri(uri)
.exchangeToMono(res -> res.bodyToFlux(responseType).collectList())
.block();
}
}
ClientResponseをexchangeToMonoの引数内で取得し、ClientResponse#bodyToMonoを呼び出してレスポンスボディを指定した型のMonoで取得する。
ClientResponseをexchangeToMonoの引数内で取得し、ClientResponse#bodyToFluxを呼び出してレスポンスボディを指定した型のリストでMonoとして取得する。
動作確認
動作確認を行う。
文字列
戻り値にStringを指定する。
動作確認用クラス
// GETリクエスト
String resStr = client.getBody(URI.create("http://localhost:8080/rest_prototype/rest01/2"), String.class);
// 動作確認
System.out.println(resStr);
指定したURIに対してGET通信を行い、レスポンスボディを文字列で取得している。
コンソール
{"id":"2","name":"ごりら","hogeDate":"2024-06-05"}
オブジェクト
戻り値にResourceクラスを指定する。
動作確認用クラス
// GETリクエスト
Resource resObj = client.getBody(URI.create("http://localhost:8080/rest_prototype/rest01/1"), Resource.class);
// 動作確認
System.out.println(resObj);
指定したURIに対してGET通信を行い、レスポンスボディをオブジェクトで取得している。
コンソール
Resource(id=1, name=りんご, hogeDate=2025-02-01)
リスト
戻り値にリストを指定する。
動作確認用クラス
// GETリクエスト
List<Resource> resList = client.getBodyList(URI.create("http://localhost:8080/rest_prototype/rest05/"), Resource.class);
// 動作確認
resList.forEach(r -> System.out.println(r));
指定した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)
まとめ
☑ exchangeToMonoはHTTPリクエストを送信し、レスポンス(ClientResponse)を使ってMonoを返す
☑ 指定した型のオブジェクトを取得したい場合は、ClientResponse#bodyToMonoを使用する
☑ 指定した型のリストや複数データを取得したい場合は、ClientResponse#bodyToFluxを使用する