1. ホーム
  2. spring

[解決済み] RequestBodyと@RequestParamの違いは何ですか?

2023-01-29 16:33:33

質問

私は、Springのドキュメントを読んでいて @RequestBody について知るためにSpringのドキュメントを見たところ、以下のような説明がありました。

@RequestBody メソッドパラメーターアノテーションは、メソッドパラメーターがHTTPリクエストボディの値にバインドされるべきことを示します。例えば

@RequestMapping(value = "/something", method = RequestMethod.PUT)
public void handle(@RequestBody String body, Writer writer) throws IOException {
  writer.write(body);
}

<ブロッククオート

リクエストボディをメソッドの引数に変換するために HttpMessageConverter . HttpMessageConverter は、HTTP リクエストメッセージからオブジェクトへの変換と、 オブジェクトから HTTP レスポンスボディへの変換を担当します。

DispatcherServlet は、アノテーションに基づいた処理をサポートする DefaultAnnotationHandlerMappingAnnotationMethodHandlerAdapter . Spring 3.0では AnnotationMethodHandlerAdapter をサポートするように拡張されました。 @RequestBody を持ち、以下のような HttpMessageConverter がデフォルトで登録されています。

...

しかし、私が混乱したのは、彼らがドキュメントに書いた次のような文章です。

RequestBodyメソッドパラメーターアノテーションは、メソッドパラメーターがHTTPリクエストボディの値にバインドされるべきことを示します。

彼らは何を意味するのでしょうか?どなたか例を示していただけませんか?

その @RequestParam の定義は以下の通りです。

メソッドパラメータがウェブリクエストパラメータにバインドされることを示すアノテーションです。でアノテーションされたハンドラメソッドでサポートされています。 Servlet および Portlet の環境である。

私はそれらの間で混乱するようになりました。それらが互いにどのように異なるかについて、例を挙げて教えてください。

どのように解決するのですか?

@RequestParam アノテーションされたパラメータは、特定のServletリクエストパラメータにリンクされます。パラメータ値は宣言されたメソッド引数タイプに変換されます。 このアノテーションは、メソッドパラメータがウェブリクエストパラメータにバインドされるべきであることを示します。

例えばSpring RequestParam(s)に対するAngularのリクエストは以下のようになります。

$http.post('http://localhost:7777/scan/l/register?username="Johny"&password="123123"&auth=true')
      .success(function (data, status, headers, config) {
                        ...
                    })

RequestParamを持つエンドポイントです。

@RequestMapping(method = RequestMethod.POST, value = "/register")
public Map<String, String> register(Model uiModel,
                                    @RequestParam String username,
                                    @RequestParam String password,
                                    @RequestParam boolean auth,
                                    HttpServletRequest httpServletRequest) {...

@RequestBody アノテーションされたパラメータは、HTTPリクエストボディにリンクされます。パラメータの値は、HttpMessageConvertersを使用して宣言されたメソッドの引数タイプに変換されます。 このアノテーションは、メソッドパラメータがWebリクエストのボディにバインドされる必要があることを示します。

例えばSpring RequestBodyに対するAngularのリクエストは次のようになります。

$scope.user = {
            username: "foo",
            auth: true,
            password: "bar"
        };    
$http.post('http://localhost:7777/scan/l/register', $scope.user).
                        success(function (data, status, headers, config) {
                            ...
                        })

RequestBodyを持つエンドポイントです。

@RequestMapping(method = RequestMethod.POST, produces = "application/json", 
                value = "/register")
public Map<String, String> register(Model uiModel,
                                    @RequestBody User user,
                                    HttpServletRequest httpServletRequest) {... 

これが役立つといいのですが。