欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-04-02 19:59:32
目录spring rest接口路径参数可选restful风格传参spring rest接口路径参数可选我有一个 spring rest 服务,其中有一个路径参数是可选的(实际情况是我原来将参数放到路径...

spring rest接口路径参数可选

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

我试着给 @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<string> 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没找到的错误

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

按照传统方式传递参数:?a=1&b=2

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

那么按照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传递参数

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

这就是restful风格传参

也可以通过变相的组合注解实现:

  • @postmapping
  • @getmapping
  • @putmapping
  • @deletemapping
  • @patchmapping

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。