Day06-RESTful

145 阅读4分钟

关于RESTful

【百科定义】RESTFUL是一种网络应用程序的设计风格和开发方式,基于HTTP,可以使用XML格式定义或JSON格式定义。RESTFUL适用于移动互联网厂商作为业务接口的场景,实现第三方OTT调用移动网络资源的功能,动作类型为新增、变更、删除所调用资源。

RESTful是一种风格,并不是规范或标准,所以,并不一定需要完全照做!

RESTful的典型表现包括:

  • 是前后端分离的,即服务器端将响应正文

  • 根据请求尝试执行的数据操作不同,区分使用请求方式

    • POST:新增数据
    • PUT:修改数据
    • DELETE:删除数据
    • GET:查询数据
    • 通常不照做,在大多场景中,推荐以查询为主要目的的使用GET,否则,全部使用POST
  • 将某些具有唯一性的、不敏感的参数值,作为URL的一部分,例如:

    • https://blog.csdn.net/gjs935219/article/details/102531854
      

Spring MVC框架很好的支持了RESTful,当设计URL时,如果URL中包含参数值,可以使用{自定义名称}进行占位,例如:

@PostMapping("/{id}/delete")

然后,在处理请求的方法上,在对应的参数上添加@PathVariable注解,表示此参数的值应该由URL中同名占位符的值注入进来,例如:

public JsonResult delete(@PathVariable Long id) {
    // ....
}

如果占位符中的名称,与方法的参数名称并不相符,可以在@PathVariable注解参数中指定占位符名称,例如:

@PostMapping("/{id}/delete")
public JsonResult delete(@PathVariable("id") Long albumId) {
    // ....
}

在配置占位符名称时,可以在占位符名称右侧添加1个冒号,并且,在冒号右侧添加正则表达式,以限制URL中传入的值的格式,例如:

@PostMapping("/{id:[0-9]+}/delete")

则客户端提交请求时,仅当占位符位置的值是纯数字时,才会匹配此URL,否则,会导致404错误!

在没有配置正则表达式时,如果提交的请求中的占位符位置的值不是纯数字时,会导致400错误,这是服务器端接收了请求、获取了占位符位置的值并尝试转换类型时出现的错误,其实,根本没有必要接收并尝试处理此请求!所以,添加正则表达式是更有利于服务器端的做法!

当使用了正则表达式之后,其实,允许多个使用了占位符、不同匹配规则的URL同时存在,例如:

@PostMapping("/{id:[0-9]+}/delete")
public JsonResult delete(@PathVariable Long id) {
    // ...
}

@PostMapping("/{name:[a-z]+}/delete")
public JsonResult delete(@PathVariable String name) {
    // ...
}

以上2个处理请求的方法是允许同存的,当客户端提交的请求中,占位符位置是纯数字时,会执行上方的方法,占位符位置是纯小写字母时,会执行下方的方法!

需要注意,使用这种做法,必须保证某个URL只能匹配到其中某1种正则表达式,如果在以上设计的基础上,再添加:

@PostMapping("/{no:[0-9a-z]+}/delete")
public JsonResult deleteTest(@PathVariable String no) {
    // ...
}

当添加以上方法时,如果提交了 /album/a123/delete 请求,将由以上新添加的方法进行处理,如果提交了 /album/123/delete 请求,由于可以匹配多个正则表达式,框架无法判断,会出错!

另外,如果还存在以下请求:

@PostMapping("/test/delete")
public JsonResult delete() {
    // ...
}

将由以上新添加的方法进行处理,如果提交了 /album/test/delete 请求,则会执行以上新添加的方法,不会报错!

基于RESTful的URL设计,可参考:

  • 查询数据列表,格式为:/数据类型的复数

    • 例如:/albums
  • 查询某1项数据,格式为:/数据类型的复数/{ID}

    • 例如:/albums/{id:[0-9]+}
    • 其实,在RESTful的建议中,查询、修改、删除都用以上这种URL,根据请求方式来区分需要执行的数据管理操作
  • 对某1项数据执行数据管理,格式为:/数据类型的复数/{ID}/命令

    • 例如:/albums/{id:[0-9]+}/delete

指定服务端口

在Spring Boot项目中,在配置文件中通过server.port属性可以指定服务端口!

则在application-dev.yml中添加配置:

server:
  port: 9080

在VUE Cli项目中,在项目的根目录下有package.json文件,配置此文件中scripts属性中的serve属性,可以修改服务端口,例如:

image.png gitee.com/chengheng20…