У чому різниця між @RequestBody та @RequestParam?


78

Я ознайомився з весняною документацією @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. Навесні 3.0 версія AnnotationMethodHandlerAdapterрозширена для підтримки @RequestBodyі HttpMessageConverterза замовчуванням зареєстрована наступні s:

...

але моя плутанина - це речення, яке вони записали у документі, що є

Анотація параметра методу @RequestBody вказує, що параметр методу повинен бути прив'язаний до значення тіла запиту HTTP.

Що вони мають на увазі під цим? Хто-небудь може навести мені приклад?

@RequestParamВизначення навесні документ є

Анотація, яка вказує на те, що параметр методу повинен бути прив’язаний до параметра веб-запиту. Підтримується для анотованих методів обробника в середовищах Servletта Portletсередовищах.

Я заплутався між ними. Будь ласка, допоможіть мені на прикладі того, як вони відрізняються один від одного.



5
@kryger. Це не дублікат, тому що у мене є дослідження, я пройшов весняний документ. Я попросив приклад. Я дав вам визначення. Я хочу приклад того, що між ними різниться. Наведене вище запитання не надало достатньо пояснень з цього приводу, тому я не думаю, що за нього слід голосувати.
Манодж Сінгх

Відповіді:


94

@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. Ця анотація вказує на те, що параметр методу повинен бути прив’язаний до тіла веб-запиту.

Наприклад, кутовий запит на 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) {... 

Сподіваюся, це допомагає.


9

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

ОТРИМАТИ запит

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, щоб зіставити весь запит із класом моделі, і звідти ви можете отримати або встановити значення з його методів getter та setter. Перевірте нижче.

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

8

map HTTP заголовок запиту Content-Type, обробляти тіло запиту.

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

  • @RequestBodyapplication/json,

  • @RequestPartmultipart/form-data,



точно відповісти! Різні анотації відображаються у різних формах даних веб-запитів, які вказані в заголовку "Content-Type".
Едді

6

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


6
Будь ласка, наведіть приклад для. @ RequestBody
Manoj Singh

2

Це дуже просто, просто подивіться на їхні імена @RequestParam, воно складається з двох частин, одна - "Запит", що означає, що вона має справу з запитом, а інша частина - "Парам", що саме має сенс, вона збирає на карту лише параметри запити до Java-об'єктів. Той самий випадок і з @RequestBody, який збирається мати справу з даними, які надійшли із запитом, наприклад, якщо клієнт надіслав об'єкт json або xml із запитом на той момент, потрібно використовувати @requestbody.


1

Ось приклад з @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>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.