SpringのRequestBodyおよびResponseBodyアノテーション
1. 序章
このクイックチュートリアルでは、Spring @RequestBodyおよび@ResponseBodyアノテーションの簡潔な概要を説明します。
2. @RequestBody
簡単に言うと、 @RequestBodyアノテーションは、HttpRequest本体を転送オブジェクトまたはドメインオブジェクトにマップし、インバウンドHttpRequest本体のJavaオブジェクトへの自動逆シリアル化を有効にします。
まず、Springコントローラーメソッドを見てみましょう。
@PostMapping("/request")
public ResponseEntity postController(
@RequestBody LoginForm loginForm) {
exampleService.fakeAuthenticate(loginForm);
return ResponseEntity.ok(HttpStatus.OK);
}
Springは、適切なタイプが指定されていると想定して、JSONをJavaタイプに自動的に逆シリアル化します。
デフォルトでは、 @RequestBodyアノテーションでアノテーションを付けるタイプは、クライアント側コントローラーから送信されたJSONに対応している必要があります:
public class LoginForm {
private String username;
private String password;
// ...
}
ここで、 HttpRequest 本体を表すために使用するオブジェクトは、LoginFormオブジェクトにマップされます。
CURLを使用してこれをテストしてみましょう。
curl -i \
-H "Accept: application/json" \
-H "Content-Type:application/json" \
-X POST --data
'{"username": "johnny", "password": "password"}' "https://localhost:8080/.../request"
これが、@ RequestBodyアノテーションを使用するSpringRESTAPIとAngularクライアントに必要なすべてです。
3. @ResponseBody
@ResponseBody アノテーションは、返されたオブジェクトが自動的にJSONにシリアル化され、HttpResponseオブジェクトに返されることをコントローラーに通知します。
カスタムResponseオブジェクトがあるとします。
public class ResponseTransfer {
private String text;
// standard getters/setters
}
次に、関連するコントローラーを実装できます。
@Controller
@RequestMapping("/post")
public class ExamplePostController {
@Autowired
ExampleService exampleService;
@PostMapping("/response")
@ResponseBody
public ResponseTransfer postResponseController(
@RequestBody LoginForm loginForm) {
return new ResponseTransfer("Thanks For Posting!!!");
}
}
ブラウザの開発者コンソールまたはPostmanなどのツールを使用すると、次の応答が表示されます。
{"text":"Thanks For Posting!!!"}
Springはデフォルトで注釈を付けるため、@RestController注釈付きコントローラーに@ResponseBody注釈を注釈する必要はありません。
3.1. コンテンツタイプの設定
@ResponseBody アノテーションを使用する場合でも、メソッドが返すコンテンツタイプを明示的に設定できます。
そのために、@RequestMappingのproduces属性を使用できます。 @PostMapping 、@GetMappingなどのアノテーションに注意してください。 そのパラメータのエイリアスを定義します。
次に、JSON応答を送信する新しいエンドポイントを追加しましょう。
@PostMapping(value = "/content", produces = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public ResponseTransfer postResponseJsonContent(
@RequestBody LoginForm loginForm) {
return new ResponseTransfer("JSON Content!");
}
この例では、MediaType.APPLICATION_JSON_VALUE定数を使用しました。 または、 application /jsonを直接使用することもできます。
次に、同じ / content パスにマップされ、代わりにXMLコンテンツを返す新しいメソッドを実装しましょう。
@PostMapping(value = "/content", produces = MediaType.APPLICATION_XML_VALUE)
@ResponseBody
public ResponseTransfer postResponseXmlContent(
@RequestBody LoginForm loginForm) {
return new ResponseTransfer("XML Content!");
}
これで、リクエストのヘッダーで送信されたAcceptパラメータの値に応じて、異なる応答が返されます。
これを実際に見てみましょう:
curl -i \
-H "Accept: application/json" \
-H "Content-Type:application/json" \
-X POST --data
'{"username": "johnny", "password": "password"}' "https://localhost:8080/.../content"
CURLコマンドはJSON応答を返します。
HTTP/1.1 200
Content-Type: application/json
Transfer-Encoding: chunked
Date: Thu, 20 Feb 2020 19:43:06 GMT
{"text":"JSON Content!"}
それでは、Acceptパラメーターを変更しましょう。
curl -i \
-H "Accept: application/xml" \
-H "Content-Type:application/json" \
-X POST --data
'{"username": "johnny", "password": "password"}' "https://localhost:8080/.../content"
予想どおり、今回はXMLコンテンツを取得します。
HTTP/1.1 200
Content-Type: application/xml
Transfer-Encoding: chunked
Date: Thu, 20 Feb 2020 19:43:19 GMT
<ResponseTransfer><text>XML Content!</text></ResponseTransfer>
4. 結論
@RequestBodyおよび@ResponseBodyアノテーションの使用方法を示す、Springアプリ用のシンプルなAngularクライアントを構築しました。
さらに、@ResponseBodyを使用する場合のコンテンツタイプの設定方法を示しました。
いつものように、コードサンプルはGitHubでから入手できます。