spring - mvc - ¿Cuál es la diferencia entre @RequestBody y @RequestParam?
spring mvc que es (4)
Aquí hay un ejemplo con @RequestBody, ¡Primero mira el controlador!
public ResponseEntity<Void> postNewProductDto(@RequestBody NewProductDto newProductDto) {
...
productService.registerProductDto(newProductDto);
return new ResponseEntity<>(HttpStatus.CREATED);
....
}
Y aquí está el controlador 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 ....
}
);
}
Y una breve mirada a la forma
<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>
He revisado la documentación de Spring para saber sobre @RequestBody
, y me han dado la siguiente explicación:
La anotación de parámetro del método
@RequestBody
indica que un parámetro de método debe vincularse al valor del cuerpo de solicitud HTTP. Por ejemplo:
@RequestMapping(value = "/something", method = RequestMethod.PUT)
public void handle(@RequestBody String body, Writer writer) throws IOException {
writer.write(body);
}
Convierta el cuerpo de la solicitud al argumento del método utilizando un
HttpMessageConverter
.HttpMessageConverter
es responsable de la conversión del mensaje de solicitud HTTP a un objeto y la conversión de un objeto al cuerpo de respuesta HTTP.
DispatcherServlet
admite el procesamiento basado en anotaciones utilizandoDefaultAnnotationHandlerMapping
yAnnotationMethodHandlerAdapter
. En Spring 3.0, elAnnotationMethodHandlerAdapter
se amplía para admitir el@RequestBody
y tiene los siguientesHttpMessageConverter
registrados por defecto:...
pero mi confusión es la oración que han escrito en el documento que es
La anotación de parámetro del método @RequestBody indica que un parámetro de método debe vincularse al valor del cuerpo de solicitud HTTP.
¿Qué quieren decir con eso? ¿Alguien puede darme un ejemplo?
La definición de @RequestParam
en el documento de primavera es
Anotación que indica que un parámetro de método debe vincularse a un parámetro de solicitud web. Compatible con métodos de controlador anotados en entornos de
Servlet
yPortlet
.
Me confundí entre ellos. Por favor, ayúdenme con un ejemplo sobre cómo son diferentes unos de otros.
@RequestParam
anotación @RequestParam
le dice a Spring que debe mapear un parámetro de solicitud de la solicitud GET / POST a su argumento de método. Por ejemplo:
solicitud:
GET: http://someserver.org/path?name=John&surname=Smith
código de punto final:
public User getUser(@RequestParam(value = "name") String name,
@RequestParam(value = "surname") String surname){
...
}
Así que, básicamente, mientras @RequestBody
mapea la solicitud de usuario completa (incluso para POST) a una variable String, @RequestParam
hace con uno (o más, pero es más complicado) parámetro de solicitud para su argumento de método.
@RequestParam
hace que Spring @RequestParam
parámetros de solicitud desde la solicitud GET / POST a su argumento de método.
GET Request
http://testwebaddress.com/getInformation.do?city=Sydney&country=Australia
public String getCountryFactors(@RequestParam(value = "city") String city,
@RequestParam(value = "country") String country){ }
Solicitud POST
@RequestBody
hace que Spring @RequestBody
una solicitud completa a una clase de modelo y desde allí puede recuperar o establecer valores de sus métodos getter y setter. Ver abajo
http://testwebaddress.com/getInformation.do
Usted tiene datos JSON
como tales provenientes de la interfaz y llegan a su clase de controlador
{
"city": "Sydney",
"country": "Australia"
}
Java
Code - backend ( @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
parámetros anotados @RequestParam
se vinculan a parámetros específicos de solicitud de servlet. Los valores de parámetro se convierten al tipo de argumento de método declarado. Esta anotación indica que un parámetro de método debe vincularse a un parámetro de solicitud web.
Por ejemplo, la solicitud angular para Spring RequestParam (s) se vería así:
$http.post(''http://localhost:7777/scan/l/register?username="Johny"&password="123123"&auth=true'')
.success(function (data, status, headers, config) {
...
})
Punto final con 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
parámetros anotados se vinculan al cuerpo de la solicitud HTTP. Los valores de parámetro se convierten al tipo de argumento de método declarado utilizando HttpMessageConverters. Esta anotación indica que un parámetro de método debe vincularse al cuerpo de la solicitud web.
Por ejemplo, la solicitud angular para Spring RequestBody se vería así:
$scope.user = {
username: "foo",
auth: true,
password: "bar"
};
$http.post(''http://localhost:7777/scan/l/register'', $scope.user).
success(function (data, status, headers, config) {
...
})
Punto final con RequestBody:
@RequestMapping(method = RequestMethod.POST, produces = "application/json",
value = "/register")
public Map<String, String> register(Model uiModel,
@RequestBody User user,
HttpServletRequest httpServletRequest) {...
Espero que esto ayude.