注解理解:
@RequestParam
该注解含义是指从请求头中取的参数,即?后面拼接的参数。对于get,post请求,都可以在请求头中拼接参数, 故该注解可用于get请求或者post请求,修饰基本数据类型参数或者map类型参数, 不可用于修饰对象
@RequestBody
该注解含义是指从请求体重获取参数,而get请求是没有请求体的, 故该注解不可用于get请求,可用于post等请求. 但是请求头中的content-type的数据格式必须是json或者xml, 一般来说json常用
用法总结:
从注解角度:
@RequestBody:
使用 @RequestBody时: 请求方式为post, 请求头的content-type:application/json,
当参数为只有一个string时, 表示把json格式的字符串数据封装在参数中,即此时入参是一个json格式的字符串,需要自己手动json解析,详情见图片
当参数为一个对象时, 框架会帮我们把对应字段的数据封装在对象中, 注意:
1 如果某个字段没有传, 则对象中的值为该字段默认值,即基本数据类型和其对应包装类的区别, 所以对应的属性数据类型推荐使用包装类, 默认为null.
2 如果数据格式为{“id”:""}时,则对象中的属性如果是string时,其值为"", 其他数据类型为其默认值
3 如果数据格式为{“id”:null}时, 则对象中的属性为其默认值
4 数据格式中key和value要么同时传,要么同时不传
@RequestParam:
请求方式为get时: 修饰的参数可以是map也可以是多个基本数据类型参数,但不可以是对象
请求方式为post时: 因为post请求有请求体, 所以要分为请求体的数据格式来讨论
1 如果请求数据格式为form-data或者x-www-form-urlencoded: ?拼接的参数或者表单格式的参数都可以接收到
如果同时使用了?拼接和表单提交数据呢?下图为测试, 生产上是不会这么使用的, 注意下
发现结果就是: ?后的数据会被加上逗号,拼接上表单中的数据