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から入手できます。