В чем разница между @RequestBody и @RequestParam?
я прошел через весеннюю документацию, чтобы узнать о @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 зарегистрирован по умолчанию:...
но мое замешательство-это предложение, которое они написали в doc, которое
аннотация параметра метода @RequestBody указывает, что параметр метода должен быть привязан к значению тела HTTP-запроса.
что они имеют в виду? Может ли кто-нибудь привести мне пример?
на @RequestParam
определение весной doc является
аннотация, которая указывает, что параметр метода должен быть привязан к параметру веб-запроса. Поддерживается для аннотированных методов обработчика в
Servlet
иPortlet
средах.
я стал запутался между ними. Пожалуйста, помогите мне с примером того, как они отличаются друг от друга.
4 ответов
@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) {...
надеюсь, что это помогает.
@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
делает это с одним (или более - но это сложнее) запросом param к вашему аргументу метода.
@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;
}
}
вот пример с @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>