В чем разница между @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 в весеннем документе:

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

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


person Manoj Singh    schedule 20.01.2015    source источник
comment
возможный дубликат изучения Spring @RequestBody и @RequestParam   -  person kryger    schedule 20.01.2015
comment
@kryger. Это не дубликат, потому что у меня есть свои исследования, я просмотрел весенний документ. Я попросил пример. Я дал вам определение. Я хочу пример того, что между ними различается. Выше вопрос не дал достаточного объяснения по этому поводу, поэтому я не думаю, что он должен быть отклонен.   -  person Manoj Singh    schedule 21.01.2015


Ответы (6)


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

Например, угловой запрос 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) {... 

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

person Patrik Bego    schedule 06.10.2015

@RequestParam заставляет Spring отображать параметры запроса из запроса GET / POST в аргумент вашего метода.

Запрос GET

http://testwebaddress.com/getInformation.do?city=Sydney&country=Australia

public String getCountryFactors(@RequestParam(value = "city") String city, 
                    @RequestParam(value = "country") String country){ }

Запрос POST

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

http://testwebaddress.com/getInformation.do

У вас есть JSON данные как таковые, поступающие из внешнего интерфейса и попадающие в класс вашего контроллера

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

Java Код - серверная часть (@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;
    }
}
person Dulith De Costa    schedule 17.05.2018

сопоставить заголовок HTTP-запроса Content-Type, обработать тело запроса.

  • @RequestParamapplication/x-www-form-urlencoded,

  • @RequestBodyapplication/json,

  • @RequestPartmultipart/form-data,


  • # P2 #
    # P3 # # P4 #
  • # P5 #
    # P6 #
  • # P7 #
    # P8 # # P9 #
  • # P10 #
    # P11 # # P12 #
person 山茶树和葡萄树    schedule 03.08.2019
comment
точно ответ! Различные аннотации сопоставляются с разными формами данных веб-запросов, которые указаны в заголовке Content-Type. - person Eddy; 22.12.2020

Аннотация @RequestParam сообщает 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) в строковую переменную, @RequestParam делает это с одним (или несколькими, но это более сложным) параметром запроса для аргумента вашего метода.

person Rafal G.    schedule 20.01.2015
comment
Приведите пример для. @ RequestBody - person Manoj Singh; 20.01.2015

Это очень просто, просто посмотрите на их имена @RequestParam, они состоят из двух частей: одна - это «Запрос», что означает, что он будет обрабатывать запрос, а другая часть - «Парам», что само по себе имеет смысл, оно будет отображать только параметры запросы к java-объектам. То же самое и с @RequestBody, он будет иметь дело с данными, которые были получены с запросом, например, если клиент отправил объект json или xml с запросом, в это время необходимо использовать @requestbody.

person Ch. Rohit Malik    schedule 12.08.2019

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

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

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

}

А вот угловой контроллер

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>
person Pinkk Wormm    schedule 17.03.2017