Spring FrameworkのWebClientを使用してPOSTリクエストを送信し、返却されるレスポンスがJSON形式ではなくHTML形式だった場合、それを検出して処理することは可能です。WebClientを使用してレスポンスボディの内容をチェックし、適切な処理を行う方法を以下に説明します。
レスポンスボディの形式を確認する方法
HTTPヘッダーをチェックする: 通常、サーバーはレスポンスのContent-Typeヘッダーを指定します。application/jsonであればJSON形式、text/htmlであればHTML形式が期待されます。これを利用してレスポンス形式をチェックできます。
ボディの内容をチェックする: レスポンスボディ自体を読み込んで、JSONかHTMLかを判別することも可能です。
サンプルコード
以下のコードでは、WebClientを使ってPOSTリクエストを送信し、レスポンスのContent-Typeヘッダーをチェックした後、JSON形式かHTML形式かを判定しています。
import org.springframework.web.reactive.function.client.WebClient;
import org.springframework.http.MediaType;
import reactor.core.publisher.Mono;
public class WebClientExample {
public static void main(String[] args) {
WebClient webClient = WebClient.create();
webClient.post()
.uri("https://example.com/api")
.header("Content-Type", "application/json")
.bodyValue("{\"key\":\"value\"}")
.retrieve()
.toEntity(String.class)
.flatMap(response -> {
MediaType contentType = response.getHeaders().getContentType();
if (MediaType.APPLICATION_JSON.equals(contentType)) {
// JSONの場合の処理
System.out.println("Response is JSON: " + response.getBody());
} else if (MediaType.TEXT_HTML.equals(contentType)) {
// HTMLの場合の処理
System.out.println("Response is HTML: " + response.getBody());
} else {
// その他の形式の場合の処理
System.out.println("Unknown response type: " + response.getBody());
}
return Mono.empty();
})
.block(); // ブロッキングで結果を取得
}
}
説明
retrieve()を使ってリクエストを送信し、toEntity(String.class)でレスポンスボディを文字列として取得しています。
response.getHeaders().getContentType()でContent-Typeヘッダーを確認し、application/jsonかtext/htmlかを判別しています。
それに基づいて、適切な処理を行うことができます。
注意点
サーバーが正しいContent-Typeを返さない場合があるため、ボディの内容を文字列として取得し、JSONの構造(例:{}で始まるかどうか)を確認することも可能です。
block()を使うと非同期処理を同期的に待つことができますが、非同期処理を維持したい場合はリアクティブストリームを活用できます。
これで、返却されるボディがJSONかHTMLかを検出して適切に処理することが可能です。