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の静的メソッドを介してそれらの機能にアクセスできます。

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

@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();

さらに、 BodyBuilder status(HttpStatus status)および BodyBuilder status(int status)メソッドを使用して、任意のHTTPステータスを設定できます。

最後に、 ResponseEntity 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 コントローラからのオブジェクトの場合、リクエストの処理中に例外またはエラーが発生する可能性があります。 エラー関連の情報を他のタイプとして表されるユーザーに返します。たとえば、E

Spring 3.2は、これらの種類のシナリオを処理する新しい@ControllerAdviceアノテーションを使用してグローバル@ExceptionHandlerをサポートします。 詳細については、既存の記事こちらを参照してください。

ResponseEntityは非常に強力ですが、使いすぎないようにしてください。単純なケースでは、ニーズを満たす他のオプションがあり、コードがはるかにクリーンになります。

3. 代替案

3.1. @ResponseBody

従来のSpringMVCアプリケーションでは、エンドポイントは通常、レンダリングされたHTMLページを返します。 実際のデータのみを返す必要がある場合もあります。 たとえば、AJAXでエンドポイントを使用する場合です。

このような場合、リクエストハンドラメソッドを @ResponseBody でマークでき、Springはメソッドの結果値をHTTPレスポンスボディ自体として扱います。

詳細については、この記事から始めるとよいでしょう

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応答を操作する複数の方法について説明し、それらの長所と短所を調べました。

いつものように、例はGitHubから入手できます。