Qual è la differenza tra @RequestBody e @RequestParam?

Ho @RequestBody la documentazione di Spring per sapere di @RequestBody , e hanno dato la seguente spiegazione:

L’annotazione del parametro del metodo @RequestBody indica che un parametro del metodo deve essere associato al valore del corpo della richiesta HTTP. Per esempio:

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

Si converte il corpo della richiesta nell’argomento del metodo utilizzando un HttpMessageConverter . HttpMessageConverter è responsabile della conversione dal messaggio di richiesta HTTP a un object e la conversione da un object al corpo della risposta HTTP.

DispatcherServlet supporta l’elaborazione basata sull’annotazione utilizzando DefaultAnnotationHandlerMapping e AnnotationMethodHandlerAdapter . In Spring 3.0, l’ AnnotationMethodHandlerAdapter viene esteso per supportare @RequestBody e ha i seguenti HttpMessageConverter registrati per impostazione predefinita:

ma la mia confusione è la frase che hanno scritto nel documento che è

L’annotazione del parametro del metodo @RequestBody indica che un parametro del metodo deve essere associato al valore del corpo della richiesta HTTP.

Cosa intendono con questo? Qualcuno può fornirmi un esempio?

La definizione di @RequestParam in spring è doc

Annotazione che indica che un parametro del metodo deve essere associato a un parametro di richiesta Web. Supportato per i metodi del gestore annotato negli ambienti Servlet e Portlet .

Sono diventato confuso tra loro. Per favore, aiutami con un esempio su come sono diversi gli uni dagli altri.

@RequestParam parametri annotati @RequestParam vengono collegati a specifici parametri di richiesta @RequestParam . I valori dei parametri vengono convertiti nel tipo di argomento del metodo dichiarato. Questa annotazione indica che un parametro del metodo deve essere associato a un parametro di richiesta Web.

Ad esempio, la richiesta angular per Spring RequestParam dovrebbe essere simile a quella seguente:

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

Endpoint con RequestParam:

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

@RequestBody parametri annotati @RequestBody vengono collegati al corpo della richiesta HTTP. I valori dei parametri vengono convertiti nel tipo di argomento del metodo dichiarato utilizzando HttpMessageConverters. Questa annotazione indica che un parametro del metodo deve essere associato al corpo della richiesta web.

Ad esempio, la richiesta angular per Spring RequestBody sarebbe simile a questa:

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

Endpoint con RequestBody:

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

Spero che questo ti aiuti.

@RequestParam annotazione @RequestParam indica a Spring che deve mappare un parametro di richiesta dalla richiesta GET / POST al tuo argomento del metodo. Per esempio:

richiesta:

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

codice endpoint:

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

Quindi, in pratica, mentre @RequestBody mapping dell’intera richiesta utente (anche per POST) a una variabile String, @RequestParam fa con uno (o più – ma è più complicato) il parametro di richiesta all’argomento del metodo.

@RequestParam rende Spring per mappare i parametri di richiesta dalla richiesta GET / POST al tuo argomento del metodo.

Richiedi

 http://testwebaddress.com/getInformation.do?city=Sydney&country=Australia public String getCountryFactors(@RequestParam(value = "city") String city, @RequestParam(value = "country") String country){ } 

Richiesta POST

@RequestBody rende Spring per mappare l’intera richiesta a una class del modello e da lì è ansible recuperare o impostare valori dai suoi metodi getter e setter. Controlla qui sotto.

 http://testwebaddress.com/getInformation.do 

Hai dati JSON come tali provenienti dal front-end e colpiscono la tua class controller

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

Codice Java – 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; } } 

Ecco un esempio con @RequestBody, Primo sguardo al controller !!

  public ResponseEntity postNewProductDto(@RequestBody NewProductDto newProductDto) { ... productService.registerProductDto(newProductDto); return new ResponseEntity<>(HttpStatus.CREATED); .... } 

Ed ecco il controller 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 .... } ); } 

E una breve occhiata alla forma