SpringResponseEntityを使用してHTTP応答を操作する
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
@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
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でから入手できます。