@RequestParam和@RequestBody是Spring框架中常用的两种请求参数注解。有时候容易搞不清楚,今天我们就发简单的说一说。
@RequestParam注解表示请求参数的键值对。当使用@RequestParam注解对请求参数进行绑定时,Spring会将请求参数按照参数名逐个与方法的形参逐个绑定。如果请求参数有多个值,则绑定的值是第一个。
下面是@RequestParam的使用示例:
@RequestMapping(value = "/test", method = RequestMethod.GET)
@ResponseBody
public String testRequestParam(@RequestParam("name") String name, @RequestParam("age") int age) {
// ...
}
在上述示例中,使用@RequestParam注解来绑定请求参数,当发送一个GET请求:
http://localhost:8080/test?name=Tom&age=24
则@RequestParam会将name请求参数绑定到方法的name形参,将age请求参数绑定到方法的age形参。
@RequestBody注解表示请求的消息体。它可以将请求的JSON格式的数据转换成Java对象。在RESTful风格的接口中,常常用于接收客户端发送的JSON格式数据,并使用Jackson来将JSON字符串转换成对应的Java对象。
下面是@RequestBody的使用示例:
@RequestMapping(value = "/test", method = RequestMethod.POST)
@ResponseBody
public String testRequestBody(@RequestBody User user) {
// ...
}
public class User {
private String name;
private int age;
// ...
}
在上述示例中,使用@RequestBody注解来绑定请求的消息体。当发送一个POST请求:
http://localhost:8080/test
{
"name": "Tom",
"age": 24
}
则@RequestBody会将请求的消息体解析成User对象,并绑定到方法的user形参中。
`
区别主要有以下两个方面:
第一个区别是请求参数的位置不同。@RequestParam注解用于绑定请求参数,而@RequestBody注解用于绑定请求的消息体。
第二个区别是数据格式不同。@RequestParam注解处理的是键值对形式的请求参数,如age=24,而@RequestBody注解处理的是JSON、XML等格式的请求消息体。
另外,@RequestParam注解比@RequestBody注解要常用,前者适用于单个简单类型的参数,后者适用于多个复杂对象类型的参数。同时,需要注意的是,@RequestBody注解标注的参数通常需要设置Content-Type参数。例如:
@RequestMapping(value = "/test", method = RequestMethod.POST, consumes="application/json")
@ResponseBody
public String testRequestBody(@RequestBody User user) {
// ...
}
在上述示例中,加上consumes="application/json"的目的是告诉Spring MVC,接收后端数据格式为application/json,否则会默认使用application/x-www-form-urlencoded的格式。由此,就需要根据实际场景以及数据格式的不同来选择@RequestParam或者@RequestBody。