20

Ich habe durch die Frühlings-Dokumentation gegangen über @RequestBody, zu wissen, und sie haben die folgende Erklärung gegeben:Was ist der Unterschied zwischen @RequestBody und @RequestParam?

Die @RequestBody Methodenparameter Anmerkung gibt an, dass ein Methodenparameter auf den Wert des HTTP-Anforderung Körpers gebunden werden soll. Zum Beispiel:

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

Sie wandeln die Anfrage Körper der Methode Argument durch eine HttpMessageConverter verwenden. HttpMessageConverter ist für die Konvertierung von der HTTP-Anforderungsnachricht in ein Objekt und die Konvertierung von einem Objekt in den HTTP-Antworttext zuständig.

DispatcherServlet unterstützt Annotations-basierte Verarbeitung unter Verwendung der DefaultAnnotationHandlerMapping und AnnotationMethodHandlerAdapter. Im Frühjahr 3.0 ist die AnnotationMethodHandlerAdapter erweitert die @RequestBody und hat folgende HttpMessageConverter s standardmäßig registriert zu unterstützen:

...

aber meine Verwirrung ist der Satz, den sie in der doc geschrieben haben, die

ist

Der @RequestBody-Methodenparameter annotation gibt an, dass ein Methodenparameter an den Wert des HTTP-Anforderungshauptteils gebunden werden soll.

Was bedeuten sie? Kann mir jemand ein Beispiel geben?

Die @RequestParam Definition im Frühjahr doc ist

Annotation, die das sollte ein Verfahren angibt Parameter auf einen Web-Anfrage Parameter gebunden sein. Unterstützt für annotierte Handlermethoden in Umgebungen Servlet und Portlet.

Ich bin zwischen ihnen verwirrt worden. Bitte hilf mir mit einem Beispiel, wie sie sich voneinander unterscheiden.

+0

möglich Duplikat [Spring @RequestBody Lernen und @RequestParam] (http: // Stackoverflow. com/questions/3337350/learning-springs-requestbody-and-requestparam) – kryger

+0

@kryger .Es ist nicht doppelt, weil ich meine Forschung habe, habe ich durch den Frühling doc.Ich habe für das Beispiel fragen. Ich habe Ihnen die Definition gegeben. Ich möchte ein Beispiel dafür, was zwischen ihnen unterschiedlich ist. Die obige Frage hat nicht genügend Erklärung dafür geliefert, also glaube ich nicht, dass es abgelehnt werden sollte. –

Antwort

31

@RequestParam annotierte Parameter werden mit bestimmten Servlet-Anforderungsparametern verknüpft. Parameterwerte werden in den deklarierten Methodenargumenttyp konvertiert. Diese Annotation gibt an, dass ein Methodenparameter an einen Webanforderungsparameter gebunden werden soll.

Zum Beispiel Angular Anfrage für den Frühling RequestParam (n) würde so aussehen:

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

Endpoint mit 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 kommentierte Parameter die verlinkt wird HTTP-Anfragetext Parameterwerte werden mithilfe von HttpMessageConverters in den deklarierten Methodenargumenttyp konvertiert. Diese Annotation gibt an, dass ein Methodenparameter an den Hauptteil der Webanforderung gebunden werden soll.

Zum Beispiel Angular Anfrage für Frühling RequestBody würde so aussehen:

$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 mit RequestBody:

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

Hoffnung, das hilft.

+0

Ich sehe diese Antwort wurde akzeptiert, es gibt auch 'up' Stimmen dafür. Aber ist das erste eckige Beispiel für @RequestParam korrekt? – 112g

+0

Was lässt Sie glauben, dass es nicht korrekt ist? –

+0

Dies wird JSON Anfrage erzeugen. '@RequestParam String username' gibt an, dass der Benutzername der Parameter der Webanfrage sein soll. – 112g

1

@RequestParam Annotation teilt Spring mit, dass es einen Anforderungsparameter von der GET/POST-Anforderung zu Ihrem Methodenargument zuordnen sollte. Zum Beispiel:

Anfrage:

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

Endpunktcode:

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

Also im Grunde, während @RequestBody gesamte Benutzeranforderung Karten (auch für POST) auf ein String-Variable, @RequestParam tut dies mit einer (oder mehr - aber es ist komplizierter) fordern Sie param zu Ihrem Methodenargument an.

+2

Bitte geben Sie ein Beispiel für. @ RequestBody –

0

Hier ist ein Beispiel mit @RequestBody, schauen Sie sich zuerst den Controller an !!

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

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

} 

Und hier ist Winkelregler

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 .... 
         } 
       ); 
      } 

und einen kurzen Blick auf

Form
<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> 
Verwandte Themen