如何让Spring|如何让Spring Rest 接口中路径参数可选
目录
- Spring Rest接口路径参数可选
- RestFul风格传参
Spring Rest接口路径参数可选 我有一个 Spring Rest 服务,其中有一个路径参数是可选的(实际情况是我原来将参数放到路径中,而另外一个前端通过 body 传给我)。按照传统的方式是把这个服务在代码里面分成两个方法,一个带路径参数,一个不带,但是这样看起来不优雅,让人疑惑。
我试着给 @PathVariable 注解加上 require=false 注解,但是不起作用,返回404错误。
下面的形式就是传统方式:
@RequestMapping(value = "https://www.it610.com/path/{id}")public String getResource(@PathVariable String id) {return service.processResource(id); } @RequestMapping(value = "https://www.it610.com/path")public String getResource() {return service.processResource(); }
但是我真的不喜欢这种方式,臃肿。
从 Spring 4 and Java 8 开始(其实和 Java 8 关系不大),在一个方法里面实现可选路径参数变得很简单,如下所示,就是同时定义两个路由:
@RequestMapping(value = https://www.it610.com/article/{"/path", "/path/{id}")public String getResource(@PathVariable Optional id) {if (id.isPresent()) {return service.processResource(id.get()); } else {return service.processResource(); }}
确实,在一个方法里面统一业务要优雅得多。
RestFul风格传参 RestFul风格就是所有参数都由/传递,而不是传统的?xx&xx形式
例如:写一个Controller:
package controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; @Controllerpublic class RestfulController {@RequestMapping("/add")public String test(int a,int b, Model model){int res = a+b; model.addAttribute("msg","结果为"+res); return "test"; }}
可以看到出现a,b没找到的错误
文章图片
按照传统方式传递参数:?a=1&b=2
文章图片
那么按照Restful风格传递参数就应该:在方法参数值前加@PathVariable注解,并在url上直接绑定参数,可以同时设置Request的方法类型(GET、POST、DELETE、OPTIONS、HEAD、PATCH、PUT、TRACE)
@PathVariable:让方法参数的值对应绑定到一个url模板变量上
package controller; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; @Controllerpublic class RestfulController {@RequestMapping(value = "https://www.it610.com/add/{a}/{b}",method = RequestMethod.GET)public String test(@PathVariable int a,@PathVariable int b, Model model){int res = a+b; model.addAttribute("msg","结果为"+res); return "test"; }}
再次开启Tomcat,并设定a=1,b=3:
/add/1/3传递参数
文章图片
这就是restful风格传参
也可以通过变相的组合注解实现:
@PostMapping
@GetMapping
@PutMapping
@DeleteMapping
@PatchMapping
推荐阅读
- 考研英语阅读终极解决方案——阅读理解如何巧拿高分
- 如何寻找情感问答App的分析切入点
- 诗歌:|诗歌: 《让我们举起世界杯,干了!》
- Activiti(一)SpringBoot2集成Activiti6
- mybatisplus如何在xml的连表查询中使用queryWrapper
- MybatisPlus使用queryWrapper如何实现复杂查询
- 微习惯复盘
- SpringBoot调用公共模块的自定义注解失效的解决
- 解决SpringBoot引用别的模块无法注入的问题
- 如何在Mac中的文件选择框中打开系统隐藏文件夹