如何让Spring Rest 接口中路径参数可选

网友投稿 296 2022-09-18


如何让Spring Rest 接口中路径参数可选

目录Spring Rest接口路径参数可选RestFul风格传参

Spring Rest接口路径参数可选

我有一个 Spring Rest 服务,其中有一个路径参数是可选的(实际情况是我原来将参数放到路径中,而另外一个前端通过 body 传给我)。按照传统的方式是把这个服务在代码里面分成两个方法,一个带路径参数,一个不带,但是这样看起来不优MWxpfKF雅,让人疑惑。

我试着给 @PathVariable 注解加上 require=false 注解,但是不起作用,返回404错误。

下面的形式就是传统方式:

@RequestMapping(value = "/path/{id}")

public String getResource(@PathVariable String id) {

return service.processResource(id);

}

@RequestMapping(value = "/path")

public String getResource() {

return service.processResource();

}

但是我真的不喜欢这种方式,臃肿。

从 Spring 4 and java 8 开始(其实和 Java 8 关系不大),在一个方法里面实现可选路径参数变得很简单,如下所示,就是同时定义两个路由:

@RequestMapping(value = {"/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;

@Controller

public 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;

@Controller

public class RestfulController {

@RequestMapping(value = "/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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:IPPBX融合通信方案_电话交换机集团IP电话交换机方案(ippbx组网方案)
下一篇:RouterOS 6.48.6 安装与配置(RouterOS)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~