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

2 篇文章 0 订阅

现在越来越多的服务都转向使用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<>();
}

很明显,这样的话,将会导致这个方法太难看 : ( 。

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

方法一
换成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 ...
}

不过,有些人可能会纠结于上面的 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 ...
}

这种情况下,请求的URL应该是类似于下面这样的:

http://localhost:8080/app/names?queryDtoStr={"query1":12,"query2":2,"query3":2}

当然,为了避免参数中出现 #&等特殊字符,最好是采用 encodeURIComponent对参数进行转义,
具体的请参见我的另一份blog:Ajax 以GET方式请求时,参数中包含 “#” 特殊字符的处理

方法三
在网法搜索时,发现有一种说法,说“GET请求也可以带body”,如果这个可以的话,就不用像上面方法一二那样麻烦了。直接使用GET + @RequestBody即可。

不过,我没试过,也不知道怎么试,我还是想用正常的方式,即:

  • get 的参数放在 URL 后面
  • post 的参数放在body中
  • 10
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值