0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

spring framework。webclient。postのリクエストの返却のbodyがjson形式ではなくてhtmlだった場合の入力チェックは可能?

Posted at

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かを検出して適切に処理することが可能です。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?