@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
をサポートするように拡張され、デフォルトで次のHttpMessageConverter
sが登録されています。...
しかし、私の混乱は、彼らが文書に書いている文です
@RequestBodyメソッドパラメータアノテーションは、メソッドパラメータをHTTPリクエストボディの値にバインドする必要があることを示します。
それはどういう意味ですか?誰も私に例を提供できますか?
春のドキュメントの@RequestParam
定義は
メソッドパラメーターをWeb要求パラメーターにバインドする必要があることを示す注釈。
Servlet
およびPortlet
環境の注釈付きハンドラーメソッドでサポートされます。
私はそれらの間で混乱しました。それらがどのように異なるかについての例を教えてください。
@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) {...
お役に立てれば。
@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つ(またはそれ以上-より複雑)のリクエストパラメーターを使用してマッピングします。
@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;
}
}
@RequestParamの名前を見ると非常に簡単です。2つの部分で構成されます。1つは「Request」で、リクエストを処理します。他の部分は「Param」です。 Javaオブジェクトへのリクエスト。 @RequestBodyの場合も同様で、クライアントがリクエストでjsonオブジェクトまたはxmlを送信した場合など、リクエストで到着したデータを処理します。@ requestbodyを使用する必要があります。
hTTP要求ヘッダーContent-Type
をマップし、要求の本文を処理します。
@RequestParam
←application/x-www-form-urlencoded
、
@RequestBody
←application/json
、
@RequestPart
←multipart/form-data
、
RequestParam(Spring Framework 5.1.9.RELEASE API)
クエリパラメータ、フォームデータ、およびマルチパートリクエストのパートにマップします。
RequestParam
は、名前と値のフォームフィールドで使用される可能性があります
RequestBody(Spring Framework 5.1.9.RELEASE API)
web要求の本文にバインドされます。リクエストの本文はHttpMessageConverterを介して渡され、リクエストの
content type
に応じてメソッドの引数を解決します。 (例:JSON、XML)
RequestPart(Spring Framework 5.1.9.RELEASE API)
「
multipart/form-data
」リクエストの一部を関連付けるために使用
RequestPart
は、より複雑なコンテンツを含むパーツで使用される可能性が高い
HttpMessageConverter(Spring Framework 5.1.9.RELEASE API)
hTTP要求とHTTP応答を相互に変換できるコンバーター。
既知のすべての実装クラス:...、 AbstractJsonHttpMessageConverter 、 AbstractXmlHttpMessageConverter 、...
@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>