1.はじめに

Springを使用して、私たちは通常HTTPレスポンスの微調整を含めて、同じ目的を達成するための多くの方法を持っています。

この短いチュートリアルでは、

ResponseEntity

を使用してHTTPレスポンスの本文、ステータス、およびヘッダーを設定する方法を説明します。

2.

ResponseEntity


ResponseEntity


は、HTTP応答全体(ステータスコード、ヘッダー、本文

)を表します。そのため、HTTPレスポンスを完全に設定するためにそれを使うことができます。

それを使いたいのであれば、それをエンドポイントから返さなければなりません。残りは春がお世話になります。


ResponseEntity

はジェネリック型です。結果として、レスポンスボディとして任意の型を使用できます。

@GetMapping("/hello")
ResponseEntity<String> hello() {
    return new ResponseEntity<>("Hello World!", HttpStatus.OK);
}

応答ステータスをプログラムで指定しているので、シナリオごとに異なるステータスコードを返すことができます。

@GetMapping("/age")
ResponseEntity<String> age(
  @RequestParam("yearOfBirth") int yearOfBirth) {

    if (isInFuture(yearOfBirth)) {
        return new ResponseEntity<>(
          "Year of birth cannot be in the future",
          HttpStatus.BAD__REQUEST);
    }

    return new ResponseEntity<>(
      "Your age is " + calculateAge(yearOfBirth),
      HttpStatus.OK);
}

さらに、HTTPヘッダを設定することができます。

@GetMapping("/customHeader")
ResponseEntity<String> customHeader() {
    HttpHeaders headers = new HttpHeaders();
    headers.add("Custom-Header", "foo");

    return new ResponseEntity<>(
      "Custom header set", headers, HttpStatus.OK);
}

さらに、

ResponseEntity


は2つのネストされたビルダーインタフェース

を提供します。


HeadersBuilder

とそのサブインターフェース

BodyBuilder

。そのため、

ResponseEntity

の静的メソッドを通してそれらの機能にアクセスできます。

最も単純なケースは、本文とHTTP 200応答コードを使用した応答です。

@GetMapping("/hello")
ResponseEntity<String> hello() {
    return ResponseEntity.ok("Hello World!");
}

最も人気のあるHTTPステータスコードのために、私たちは静的メソッドを得ます:

BodyBuilder accepted();
BodyBuilder badRequest();
BodyBuilder created(java.net.URI location);
HeadersBuilder<?> noContent();
HeadersBuilder<?> notFound();
BodyBuilder ok();

さらに、HTTPステータスを設定するために

BodyBuilder status(HttpStatus status)

メソッドと

BodyBuilder status(int status)

メソッドを使うことができます。

最後に

ResponseEntity <T> BodyBuilder.body(T body)

を使用して、HTTPレスポンスボディを設定できます。

@GetMapping("/age")
ResponseEntity<String> age(@RequestParam("yearOfBirth") int yearOfBirth) {
    if (isInFuture(yearOfBirth)) {
        return ResponseEntity.badRequest()
            .body("Year of birth cannot be in the future");
    }

    return ResponseEntity.status(HttpStatus.OK)
        .body("Your age is " + calculateAge(yearOfBirth));
}

カスタムヘッダを設定することもできます。

@GetMapping("/customHeader")
ResponseEntity<String> customHeader() {
    return ResponseEntity.ok()
        .header("Custom-Header", "foo")
        .body("Custom header set");
}

したがって、

BodyBuilder.body()



BodyBuilderの代わりに

ResponseEntity__を返します。これが最後の呼び出しになります。


HeaderBuilder

では、レスポンスボディのプロパティは設定できません。

コントローラから

ResponseEntity <T>

オブジェクトを返す際に、リクエストの処理中に何らかの例外やエラーが発生する可能性があり、他の型として表現されるエラー関連の情報をユーザーに返すことを望んでいます。

Spring 3.2はグローバルな** ExceptionHandlerをサポートします。新しい

__ @ ControllerAdvice

__アノテーションはこれらの種類のシナリオを扱います。

詳細については、当社の既存の記事https://www.baeldung.com/exception-handling-for-rest-with-springを参照してください。


  • ResponseEntity

    は非常に強力ですが、使いすぎてはいけません** 単純なケースでは、私たちのニーズを満たす他のオプションがあり、それらはよりきれいなコードになります。

3.代替案

3.1.

@ ResponseBody

従来のSpring MVCアプリケーションでは、エンドポイントは通常レンダリングされたHTMLページを返します。 AJAXでエンドポイントを使用する場合など、実際のデータを返すだけでよい場合があります。

そのような場合、リクエストハンドラメソッドを

@ ResponseBody

でマークすることができ、

Springはメソッドの結果値をHTTPレスポンスボディ

として扱います。

詳細については、link:/spring-request-response-bodyを参照してください。

3.2.

@ ResponseStatus

エンドポイントが正常に戻ると、SpringはHTTP 200(OK)応答を返します。エンドポイントが例外をスローした場合、SpringはどのHTTPステータスを使用するかを通知する例外ハンドラを探します。

これらのメソッドに@ResponseStatusを付けることができます。したがって、Spring

はカスタムHTTPステータス

を返します。

その他の例については、

カスタムステータスコード

に関する記事をご覧ください。

3.3. 応答を直接操作する

Springでは、

javax.servlet.http.HttpServletResponse

オブジェクトに直接アクセスすることもできます。メソッドの引数として宣言するだけです。

@GetMapping("/manual")
void manual(HttpServletResponse response) throws IOException {
    response.setHeader("Custom-Header", "foo");
    response.setStatus(200);
    response.getWriter().println("Hello World!");
}

Springは基礎となる実装の上に抽象化と追加機能を提供しているので、

このように応答を操作することはできません

4.まとめ

この記事では、SpringでHTTP応答を操作するための利点と欠点をいくつか紹介しました。

いつものように、例はhttps://github.com/eugenp/tutorials/tree/master/spring-mvc-java[over on GitHub]から入手可能です。