que mvc example español dispatcherservlet spring spring-mvc spring-boot servlet-3.0 http-request-parameters

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 utilizando DefaultAnnotationHandlerMapping y AnnotationMethodHandlerAdapter . En Spring 3.0, el AnnotationMethodHandlerAdapter se amplía para admitir el @RequestBody y tiene los siguientes HttpMessageConverter 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 y Portlet .

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.