说明白注解@RequestParam与@RequestBody的使用场景

2,657 阅读2分钟

@RequestParam和@RequestBody是Spring框架中常用的两种请求参数注解。它们的使用场景和区别如下:

  • @RequestParam使用场景

@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使用场景

@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注解用于绑定请求参数,而@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。