20

Ho passato con la documentazione di primavera di conoscere @RequestBody, e hanno dato la seguente spiegazione:Qual è la differenza tra @RequestBody e @RequestParam?

Il parametro @RequestBody metodo di annotazione indica che un parametro di metodo dovrebbe essere legato 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 per l'argomento metodo utilizzando un HttpMessageConverter. HttpMessageConverter è responsabile della conversione dal messaggio di richiesta HTTP a un oggetto e la conversione da un oggetto al corpo della risposta HTTP.

DispatcherServlet supporta l'elaborazione basata sull'annotazione utilizzando DefaultAnnotationHandlerMapping e AnnotationMethodHandlerAdapter. Nella primavera del 3,0 AnnotationMethodHandlerAdapter è esteso per supportare il @RequestBody ed ha le seguenti HttpMessageConverter s registrati per impostazione predefinita:

...

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

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

Che cosa intendono con questo? Qualcuno può fornirmi un esempio?

La definizione @RequestParam nel doc molla è

nota che indica che un parametro metodo dovrebbe essere associato a un parametro 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.

+0

possibile duplicato del [imparare @RequestBody di primavera e @RequestParam] (http: // StackOverflow. it/questions/3337350/learning-springs-requestbody-and-requestparam) – kryger

+0

@kryger. Non è duplicato, perché ho la mia ricerca, ho passato il doc primavera. Ho chiesto l'esempio. Ti ho dato una definizione. Voglio un esempio che cosa è diverso tra loro. La domanda di cui sopra non ha fornito una spiegazione sufficiente al riguardo, quindi non penso che dovrebbe essere votato. –

risposta

31

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

Per esempio richiesta angolare per la primavera RequestParam (s) sarebbe simile che:

$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<String, String> register(Model uiModel, 
            @RequestParam String username, 
            @RequestParam String password, 
            @RequestParam boolean auth, 
            HttpServletRequest httpServletRequest) {... 

@RequestBody parametri annotati vengono legati 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.

Per esempio richiesta angolare per la primavera RequestBody sarebbe simile a quello:

$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<String, String> register(Model uiModel, 
            @RequestBody User user, 
            HttpServletRequest httpServletRequest) {... 

Spero che questo aiuti.

+0

Vedo questa risposta è stata accettata, ci sono anche voti 'su' per questo. Ma è il primo esempio angolare per @RequestParam corretto? – 112g

+0

Cosa ti fa pensare che non sia corretto? –

+0

Questo produrrà richiesta json. '@RequestParam String username' indica che il nome utente deve essere il parametro della richiesta web. – 112g

1

@RequestParam annotazione indica a Spring che deve associare 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, fondamentalmente, mentre @RequestBody mappe intera richiesta dell'utente (anche per POST) per una variabile stringa, @RequestParam fa con uno (o più - ma è più complicato) richiesta param al tuo argomento metodo.

+2

Si prega di dare esempio per. @ RequestBody –

0

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

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

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

} 

Ed ecco regolatore angolare

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 un breve sguardo a 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> 
Problemi correlati