问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

Spring REST Controller,在GET方式下,有多个参数时的处理

发布网友 发布时间:2022-04-24 19:42

我来回答

1个回答

热心网友 时间:2023-10-09 00:00

现在越来越多的服务都转向使用RESTful了,我们的项目也不例外,使用spring来做了REST。在采用RESTful的时候,我们会严格按照约定来使用 HTTP METHOD:

GET: 查询
POST: 创建
PUT: 修改
DELETE: 删除
本来,按照这种方式来做的时候,开发都很方便。不过,最近遇到一个问题:

在一个查询接口中,需要的参数比较多,如果还是使用GET方式进行请求的话,那么,Controller 中的方法的参数列表将会非常多,如:
public List<String> getName(@RequestParam String query1,
@RequestParam String query2,
@RequestParam String query3,
......) {
return new ArrayList<>();
}
1
2
3
4
5
6
1
2
3
4
5
6
很明显,这样的话,将会导致这个方法太难看 : ( 。

那么,该如何解决这个问题呢?下面说说我的思路:

方法一
换成POST请求,将所有参数封装成一个类,然后使用 @RequestBody注解将参数自动解析成该类的一个实例,如:
public List<String> getName(@RequestBody QueryDto queryDto) {
return new ArrayList<>();
}

public class QueryDto {
private String query1;
private String query2;
private String query3;

// getter, setter ...
}
1
2
3
4
5
6
7
8
9
10
11
1
2
3
4
5
6
7
8
9
10
11
不过,有些人可能会纠结于上面的 RESTful“规范”,认为POST不应该用来进行查询。
对,这么想的确是合理的,不过,这个“规范”只是建议大家这么来遵守,并不是强制要求。有兴趣的,可以看看京东的请求,它的部分查询请求也是用的POST。

方法二
还是使用GET请求,但是将所有请求参数通过JSON格式来传递,controller拿到参数后,使用 JSON 相关的库(如 gson),将该JSON转化为相应的对象,如:
public List<String> getName(@RequestParam String queryDtoStr) {
QueryDto queryDto = new Gson().fromJson(queryDtoStr, QueryDto .class);
// ....
return new ArrayList<>();
}

public class QueryDto {
private String query1;
private String query2;
private String query3;

// getter, setter ...
}
1
2
3
4
5
6
7
8
9
10
11
12
13
1
2
3
4
5
6
7
8
9
10
11
12
13
这种情况下,请求的URL应该是类似于下面这样的:

http://localhost:8080/app/names?queryDtoStr={"query1":12,"query2":2,"query3":2}
1
1
当然,为了避免参数中出现 #、?、&等特殊字符,最好是采用 encodeURIComponent对参数进行转义,
具体的请参见我的另一份blog:Ajax 以GET方式请求时,参数中包含 “#” 特殊字符的处理

方法三
在网法搜索时,发现有一种说法,说“GET请求也可以带body”,如果这个可以的话,就不用像上面方法一二那样麻烦了。直接使用GET + @RequestBody即可。
不过,我没试过,也不知道怎么试,我还是想用正常的方式,即:

get 的参数放在 URL 后面
post 的参数放在body中
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
富连网AIoT赋能SMART!开启智慧教育新篇章 富士康九月四号上班算 九月三号富士康放假几天 心态好的诗句正能量 最近买了个mk8鱼骨想装在锋加盛上我刚入手水弹没多久想问 锋加盛mk8怎么换托芯 土地使用权转让协议书怎么写的(精选6篇) 128065是什么股票 Philips电脑蓝屏如何解决_philips电脑蓝屏怎么办 组装机器,运行某程序时直接蓝屏,求解决。。。 房屋租赁协议书怎么写 spring 里的beanfactory类有一个方法是getbean方法 API写可以传递两个参数一个是name 一个是requiredType 租赁协议怎么写 php通过Ajax get方法同时传递多个值 smarty模版用GET传参数时,有两个参数,该怎么匹配.对于正则一窍不通 js get请求能传递多少个参数 jquery中的get方法传参 js中get方式如何传多个参数 租赁协议书怎么写? 璞,这个字的拼音怎么读 “璞田”是什么意思? 《说岳全传》第八回的“璞”是什么意思? 微信群聊关闭了怎么还能被拉入群? 大连理工大学安全工程专业介绍排名好不好及就业前景 职业卫生专业就业前景我儿子考上中国矿业大学的安全科学与工程类专业,是调配的,大类下又还细分安全工程_百度问一问 河南理工大学安全工程就业前景和待遇怎么样?到矿上工作的话是否天天下井啊?我今年录这个专业了。 学习安全工程专业的研究生就业前景如何,一般都去哪? 安全科学与工程类包括什么专业? 安全科学与工程专业毕业后都干什么 做什么工作 安全工程专业研究生的就业前景 Java:如图,求大神们指点。关于set和get两个方法有些地方不太懂,为什么set方法括号中要传入形参int on 通过一个页面向另外的页面传参数的时候有两个方法 get方法传递的参数有哪些作用? java 中get 与set详细作用,是如何在不同的类中传参的。 php href 传递参数 可以传递多个参数吗? 也就是说 get 传递多个变量 消息头中要传两个参数怎么搞 thinkphp怎样用get方式传参 华为nova6怎么设置充电提示音? 宝宝抓周该如何准备?你会给孩子抓周吗? 抓周是什么意思?为什么要给孩子抓周?有什么说法? “抓周”是什么?在孩子多大的时候适合抓周? 宝宝抓周该如何准备?抓周有哪些意义? 宝宝抓周该如何准备?抓周有什么意义? 抓周有什么 抓周有什么习俗和禁忌 宝宝抓周怎么进行 泰裔韩国歌手LISA大片来袭,短发美背复古穿搭,经典波波头养眼吗? Lisa白雪公主同款短发,你还喜欢lisa的哪些发型呢? Lisa黑色深V新封面曝光,油头*风亮眼,她是否适合这样的造型? Lisa生图颜值引热议,没了招牌刘海,还是你心中的人间芭比吗?