Spring MVC框架支持RESTful,设计URL时可以使用{自定义名称}的占位符@Get(“/{id:[0-9]+}/delete“)

背景:在开发实践中,如果没有明确的规定URL,可以参考:

  • 传统接口
    获取数据列表,固定接口路径:/数据类型的复数
    • 例如:/albums/select
  • RESTful接口
    - 根据ID获取某条数据:/数据类型的复数/{id} - 例如:/albums/select/{id:[0-9]+}
    - 根据ID对某条数据执行某种操作:/数据类型的复数/{id}/命令,或/数据类型的复数/{id}/数据属性/命令 - 例如:/albums/{id:[0-9]+}/delete

Spring MVC框架很好的支持了RESTful,在设计URL时,可以使用{自定义名称}的占位符表示此处应该是某个参数值,在此请求参数上使用@PathVariable注解,例如:

1.URL占位符设计接口

@PostMapping("/{id}/delete")
public ??? delete(@PathVariable Long id) {
    // 暂不关心方法的实现
}

或者 如果占位符中的名称,和请求参数的名称不一致,需要在@PathVariable注解中配置占位符名称

@PostMapping("/{id}/delete")
public ??? delete(@PathVariable("id") Long albumId) {
    // 暂不关心方法的实现
}
  • 实际效果
    Spring MVC框架支持RESTful,设计URL时可以使用{自定义名称}的占位符@Get(“/{id:[0-9]+}/delete“)_第1张图片
    Spring MVC框架支持RESTful,设计URL时可以使用{自定义名称}的占位符@Get(“/{id:[0-9]+}/delete“)_第2张图片
    Spring MVC框架支持RESTful,设计URL时可以使用{自定义名称}的占位符@Get(“/{id:[0-9]+}/delete“)_第3张图片

当设计成以上格式,则客户端提交请求时,占位符位置无论是什么值,都可以匹配上以上设计的路径!注意:如果客户端提交的请求路径中,占位符位置的内容无法被转换成String类型时,将出现400错误。

2.URL正则设计接口

在设计占位符时,可以在占位符名称的右侧、在右大括号的左侧添加1个冒号,并在冒号的右侧可以添加正则表达式,以限制参数值的基本格式,例如:

@PostMapping("/{id:[0-9]+}/delete")
public ??? delete(@PathVariable Long id) {
    // 暂不关心方法的实现
}

如果客户端提交的请求路径中,占位符位置的内容不匹配以上正则表达式时,将出现404错误。
另外,使用了占位符及互斥的正则表达式的配置,是允许共存的,例如:

@Get("/{id:[0-9]+}")
public ??? getStandardById(@PathVariable Long id) {
    // 暂不关心方法的实现
}

@Get("/{name:[a-z]+}")
public ??? getStandardByName(@PathVariable String name) {
    // 暂不关心方法的实现
}

注意: 如果以上两个方法的占位符值都是纯数字的,那么一个url将可以匹配以上2个正则表达式,
则Spring MVC框架无法选取,将出现错误!

3.URL占位符跟传统接口共存,优先使用精准匹配的传统接口

另外不使用占位符的配置,与使用了占位符的配置,是允许共存的,例如:

@Get("/{name:[a-z]+}")
public ??? getStandardByName(@PathVariable String name) {
    // 暂不关心方法的实现
}

@Get("/test")
public ??? testStandardByName(String name) {
    // 暂不关心方法的实现
}

当提交了对应 /test 的请求时,会执行以上第2个方法,即精准匹配的方法,而不会执行使用了占位符的方法。

创造价值,乐哉分享!
一起入门后端 204146007

你可能感兴趣的:(我的第一个后端项目,spring,mvc,restful)