我已经阅读了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请求主体的值。
他们的意思是什么?任何人都可以提供一个例子吗?
spring doc中的@RequestParam
定义是
我在他们之间感到困惑。请帮我举一个例子,说明它们彼此之间的差异。注释,指示应将方法参数绑定到Web请求参数。支持
Servlet
和Portlet
环境中带注释的处理程序方法。
答案 0 :(得分:63)
Caused by: java.util.zip.ZipException: invalid CEN header (bad signature)
at java.util.zip.ZipFile.open(Native Method)
at java.util.zip.ZipFile.<init>(Unknown Source)
at java.util.zip.ZipFile.<init>(Unknown Source)
at java.util.jar.JarFile.<init>(Unknown Source)
at java.util.jar.JarFile.<init>(Unknown Source)
at org.apache.catalina.webresources.JarResourceSet.initInternal(JarResourceSet.java:89)
带注释的参数会链接到特定的Servlet请求参数。参数值将转换为声明的方法参数类型。
此批注指示应将方法参数绑定到Web请求参数。
例如,Spring RequestParam的Angular请求看起来像这样:
@RequestParam
带有RequestParam的端点:
$http.post('http://localhost:7777/scan/l/register?username="Johny"&password="123123"&auth=true')
.success(function (data, status, headers, config) {
...
})
@RequestMapping(method = RequestMethod.POST, value = "/register")
public Map<String, String> register(Model uiModel,
@RequestParam String username,
@RequestParam String password,
@RequestParam boolean auth,
HttpServletRequest httpServletRequest) {...
带注释的参数会链接到HTTP请求正文。使用HttpMessageConverters将参数值转换为声明的方法参数类型。
此批注指示应将方法参数绑定到Web请求的主体。
例如,Spring RequestBody的Angular请求看起来像这样:
@RequestBody
带有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) {
...
})
希望这有帮助。
答案 1 :(得分:5)
@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
使用一个(或更多 - 但更复杂)请求param到您的方法参数。
答案 2 :(得分:4)
@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;
}
}
答案 3 :(得分:1)
非常简单,只需查看它们的名称@RequestParam,它由两部分组成,一个是“ Request”,这意味着它将处理请求,另一部分是“ Param”,这本身就意味着仅要映射对Java对象的请求参数。 与@RequestBody一样,它将处理已随请求到达的数据,例如,如果客户端当时已使用请求发送json对象或xml,则必须使用@requestbody。
答案 4 :(得分:0)
以下是@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>
答案 5 :(得分:0)
映射HTTP请求标头Content-Type
,处理请求正文。
@RequestParam
←application/x-www-form-urlencoded
,
@RequestBody
←application/json
,
@RequestPart
←multipart/form-data
,
RequestParam (Spring Framework 5.1.9.RELEASE API)
映射到查询参数,表单数据和多部分请求中的部分。
RequestParam
可能与名称/值表单字段一起使用
RequestBody (Spring Framework 5.1.9.RELEASE API)
绑定到Web请求的正文。请求的正文通过 HttpMessageConverter 传递,以根据请求的
content type
解析方法参数。 (例如JSON,XML)
RequestPart (Spring Framework 5.1.9.RELEASE API)
用于关联“
multipart/form-data
”请求的一部分
RequestPart
可能与包含更复杂内容的部分一起使用
HttpMessageConverter (Spring Framework 5.1.9.RELEASE API)
可以在HTTP请求和响应之间进行转换的转换器。
所有已知的实现类:...,AbstractJsonHttpMessageConverter,AbstractXmlHttpMessageConverter,...