三者都用于在Controller层接收前端传递的数据。
@RequestParam和@PathVariable
@PathVariable主要用于接收http://host:port/path/{参数值}数据。
@RequestParam主要用于接收http://host:port/path?参数名=参数值数据,这里后面也可以不跟参数值。
@RequestParam和@PathVariable这两者之间区别不大,主要是请求的URL不一样
例子:
//@PathVariable用法
@RequestMapping(value="getUserById/{userId}",method = RequestMethod.GET)
public Object getUserById(@PathVariable String userId)
//@RequestParam用法,注意这里请求后面没有添加参数
@RequestMapping(value="getUserById",method = RequestMethod.GET)
public Object getUserById(@RequestParam String userId)
用@RequestParam请求接口时,URL是:http://www.test.com/user/getUserById?userId=1
用@PathVariable请求接口时,URL是:http://www.test.com/user/getUserById/1
所以为了实现RestFul的风格,会采用@PathVariable这种方式
关于@RequestParam:
@RequestMapping(value = "/test",method = RequestMethod.POST)
public Result test(@RequestParam(value="id",required=false,defaultValue="0")String id)
注意上面@RequestParam用法当中的参数。
- value表示接收数据的名称。
- required表示接收的参数值是否必须,默认为true,既默认参数必须不为空,当传递过来的参数可能为空的时候可以设置required=false。
- 此外还有一个参数defaultValue。表示如果此次参数未空则为其设置一个默认值。
@RequestParam和@RequestBody
RequestParam注解接收的参数是来自于url中,格式为xxx?username=123&password=456,而RequestBody注解接收的参数则是来自于requestBody中,即请求体中。
从Content-Type方面总结:
@RequestParam:
用来接收 Content-Type 是 application/x-www-form-urlencoded (这种格式的数据例如 user=1234&pwd=1234)编码的内容,这是浏览器默认的 content-Type(请求内容)格式。
@RequestBody:
用来处理不是 application/x-www-form-urlencoded 编码的内容例如:application/json application/xml
① form-data、x-www-form-urlencoded:不可以用@RequestBody;可以用@RequestParam。见postman的格局,这两种方式的时候没有json字符串部分。
② application/json:json字符串部分可以用@RequestBody;url中的?后面参数可以用@RequestParam。见postman的格局
使用示例:
例子一
//@RequestBody 满足要求的Content-Type时,接收参数为这两种情况适用
(@RequestBody Map map)
(@RequestBody Object object)
例子二
//@RequestParam 满足要求的Content-Type时,接收参数为这两种情况适用
(@RequestParam Map map)
(@RequestParam String waterEleId,@RequestParam String enterpriseName)
注意下面这种情况:
不管Content-Type为:application/json、form-data、x-www-form-urlencoded都不可用
(@RequestParam Object object)
从请求方式总结
POST请求时
@RequestBody --> JSON字符串部分
@RequestParam --> 请求参数部分
GET请求中不可以使用@RequestBody
而@RequestParam可用于各种类型的请求,例如:GET、POST、DELETE等请求。
SpringBoot传递单一参数时@RequestParam和@RequestBody的区别
本文参考文档有:
https://blog.csdn.net/weixin_38004638/article/details/99655322
https://bbs.csdn.net/topics/392660349