Подтвердить что ты не робот

В чем разница между @RequestBody и @RequestParam?

Я просмотрел документацию Spring, чтобы узнать о @RequestBody, и они дали следующее объяснение:

Аннотирование параметра метода @RequestBody указывает, что параметр метода должен быть привязан к значению тела запроса HTTP. Например:

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

Вы преобразуете тело запроса в аргумент метода с помощью HttpMessageConverter. HttpMessageConverter отвечает за преобразование из сообщения запроса HTTP в объект и преобразование из объекта в тело ответа HTTP.

DispatcherServlet поддерживает обработку на основе аннотаций с использованием DefaultAnnotationHandlerMapping и AnnotationMethodHandlerAdapter. В Spring 3.0 AnnotationMethodHandlerAdapter расширяется для поддержки @RequestBody и имеет зарегистрированный по умолчанию HttpMessageConverter:

...

но мое замешательство - это предложение, которое они написали в документе, который

Аннотирование параметра метода @RequestBody указывает, что параметр метода должен быть привязан к значению тела запроса HTTP.

Что они подразумевают под этим? Может ли кто-нибудь предоставить мне пример?

Определение @RequestParam в Spring doc

Аннотации, указывающие, что параметр метода должен быть привязан к параметру веб-запроса. Поддерживается метод аннотированных обработчиков в средах Servlet и Portlet.

Я запутался между ними. Пожалуйста, помогите мне с примером того, как они отличаются друг от друга.

4b9b3361

Ответ 1

@RequestParam аннотированные параметры связаны с определенными параметрами запроса сервлета. Значения параметров преобразуются в тип аргумента объявленного метода. Эта аннотация указывает, что параметр метода должен быть привязан к параметру веб-запроса.

Например, запрос Angular для Spring RequestParam (s) будет выглядеть следующим образом:

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

Конечная точка с 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 аннотированные параметры связаны с телом HTTP-запроса. Значения параметров преобразуются в тип аргумента объявленного метода с использованием HttpMessageConverters. Эта аннотация указывает, что параметр метода должен быть привязан к телу веб-запроса.

Например, запрос Angular для Spring RequestBody будет выглядеть следующим образом:

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

Конечная точка с RequestBody:

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

Надеюсь, что это поможет.

Ответ 2

@RequestParam annotation сообщает Spring, что он должен отображать параметр запроса из запроса GET/POST в аргумент метода. Например:

запрос:

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

конечный код:

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

Таким образом, в то время как @RequestBody отображает весь запрос пользователя (даже для POST) на переменную String, @RequestParam делает это с одним (или более - но более сложным) параметром запроса на аргумент метода.

Ответ 3

Вот пример с @RequestBody, сначала посмотрите на контроллер!

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

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

}

А вот 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 ....
                        }
                );
            }

И короткий взгляд на форму

 <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>