web-dev-qa-db-ja.com

@RequestBodyと@RequestParamの違いは何ですか?

@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は、DefaultAnnotationHandlerMappingおよびAnnotationMethodHandlerAdapterを使用した注釈ベースの処理をサポートします。 Spring 3.0では、AnnotationMethodHandlerAdapter@RequestBodyをサポートするように拡張され、デフォルトで次のHttpMessageConvertersが登録されています。

...

しかし、私の混乱は、彼らが文書に書いている文です

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

それはどういう意味ですか?誰も私に例を提供できますか?

春のドキュメントの@RequestParam定義は

メソッドパラメーターをWeb要求パラメーターにバインドする必要があることを示す注釈。 ServletおよびPortlet環境の注釈付きハンドラーメソッドでサポートされます。

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

44
Manoj Singh

@RequestParam注釈付きパラメーターは、特定のサーブレット要求パラメーターにリンクされます。パラメータ値は、宣言されたメソッド引数タイプに変換されます。この注釈は、メソッドパラメーターをWeb要求パラメーターにバインドする必要があることを示します。

たとえば、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) {... 

お役に立てれば。

66
Patrik Bego

@RequestParamアノテーションは、GET/POSTリクエストのリクエストパラメータをメソッドの引数にマッピングする必要があることをSpringに伝えます。例えば:

要求:

GET: http://someserver.org/path?name=John&surname=Smith

エンドポイントコード:

public User getUser(@RequestParam(value = "name") String name, 
                    @RequestParam(value = "surname") String surname){ 
    ...  
    }

基本的に、@RequestBodyはユーザーリクエスト全体(POSTの場合も含む)を文字列変数にマッピングしますが、@RequestParamはメソッド引数に1つ(またはそれ以上-より複雑)のリクエストパラメーターを使用してマッピングします。

5
Rafal G.

@RequestParamは、GET/POSTリクエストのリクエストパラメータをメソッド引数にマップするようにSpringを設定します。

GETリクエスト

http://testwebaddress.com/getInformation.do?city=Sydney&country=Australia

public String getCountryFactors(@RequestParam(value = "city") String city, 
                    @RequestParam(value = "country") String country){ }

POSTリクエスト

@RequestBodyは、Springにリクエスト全体をモデルクラスにマッピングさせ、そこからゲッターメソッドとセッターメソッドから値を取得または設定できます。以下を確認してください。

http://testwebaddress.com/getInformation.do

フロントエンドから来るJSONデータがあり、コントローラークラスにヒットします

{
   "city": "Sydney",
   "country": "Australia"
}

Javaコード-バックエンド(@RequestBody

public String getCountryFactors(@RequestBody Country countryFacts)
    {
        countryFacts.getCity();
        countryFacts.getCountry();
    }


public class Country {

    private String city;
    private String country;

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getCountry() {
        return country;
    }

    public void setCountry(String country) {
        this.country = country;
    }
}
4
Dulith De Costa

@RequestParamの名前を見ると非常に簡単です。2つの部分で構成されます。1つは「Request」で、リクエストを処理します。他の部分は「Param」です。 Javaオブジェクトへのリクエスト。 @RequestBodyの場合も同様で、クライアントがリクエストでjsonオブジェクトまたはxmlを送信した場合など、リクエストで到着したデータを処理します。@ requestbodyを使用する必要があります。

1
Ch. Rohit Malik

hTTP要求ヘッダーContent-Typeをマップし、要求の本文を処理します。

  • @RequestParamapplication/x-www-form-urlencoded

  • @RequestBodyapplication/json

  • @RequestPartmultipart/form-data


@RequestBodyの例を次に示します。まずコントローラーを見てください!!

  public ResponseEntity<Void> postNewProductDto(@RequestBody NewProductDto newProductDto) {

   ...
        productService.registerProductDto(newProductDto);
        return new ResponseEntity<>(HttpStatus.CREATED);
   ....

}

そして、ここにangularコントローラーがあります

function postNewProductDto() {
                var url = "/admin/products/newItem";
                $http.post(url, vm.newProductDto).then(function () {
                            //other things go here...
                            vm.newProductMessage = "Product successful registered";
                        }
                        ,
                        function (errResponse) {
                            //handling errors ....
                        }
                );
            }

そして、フォームの概要

 <label>Name: </label>
 <input ng-model="vm.newProductDto.name" />

<label>Price </label> 
 <input ng-model="vm.newProductDto.price"/>

 <label>Quantity </label>
  <input ng-model="vm.newProductDto.quantity"/>

 <label>Image </label>
 <input ng-model="vm.newProductDto.photo"/>

 <Button ng-click="vm.postNewProductDto()" >Insert Item</Button>

 <label > {{vm.newProductMessage}} </label>
0
Pinkk Wormm