get 加body体传参
场景:
做业务的时候经常会遇到这样的场景,比如传统业务查询的时候,get 请求但是需要加好几个请求过滤参数,在加上分页的话,参数的确有点多,
@ RequestParam (用此注解把请求普通参数绑定在控制的方法上), 看起来不美观,写起来麻烦,感觉很low如果用一个对象,或者map接收多好,
干净又利落。
为啥这么做?可以实现吗?
1.问题在举的场景里面已做了简单的分析
2.首先官方不推荐这样做,但是http(基于tcp的超文本传输协议)并没有规定,get 请求不能加body
3.大家最关心的问题来了,能否实现,的确能实现,而且spring是支持的
怎么去实现?
- 用对象或者map接收参数,我们想到的就以 @RequestBody 注解以json 体的形式接收
- 需要注意的是此处要用 @RequestParam 注解来接收对象和Map参数对象
- 请求方式仍然是 get
常见的报错 ?
- 返回状态码 400(Bad Request)
答: 报着错误就是传参错误。
a. 比如接收的实体对象字段不一样
b. 传的参数格式不一样,需要的json
c.或者是中间件的限制,比如tomcat8.5 默认| 不支持 {},要改为|{}
实现案例
- 后台实现 (伪代码)
@GetMapping("/路径")
A: public Dto queryDataList(@RequestParam Map<String,Object>() params ){
return new Dto();
}
B: public Dto queryDataList(User ){ // 无注解
return new Dto();
}
Dto:(数据分装传输对象)
queryDataList:(方法名)
@RequestParam Map<String,Object>() params : (注解传参)`
@GetMapping("/路径")
- postman 测试结果(postMan版本过低测不了,get方式 body 是灰色的。选新的版本)
思考:
尽管这样解决了get 加body 体传参,但是仍建议用post 加body
eg : get
params :
{
key : value,
key2: value2,
}
value 与value2 只能 是简单的引用类型,不能是复杂的嵌套,或者对象
下面的就不可以
get
params
{
name: "",
createTime: " ",
type: {
[{ level: "",
name: [ value,value2]
},
{ levle:"",
name: [ value,value2,value3]
},
{ level: "",
name: [ value]
}
]
}
}
这个就是对象里面嵌套一个数组对象,get 此时就无能为力,只能报400,所以说还是用原配的好。
总结
get 加Body 传参的实质就是,提交个表格对象,form表单的形式绑定