关于RESTful

关于RESTful 

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

RESTful的典型表现通常有:

  • **【重要】**服务器端是响应正文,且响应的数据通常是JSON格式(早期也使用XML格式)
  • 根据尝试执行的数据操作,区分4种HTTP请求方式:
    • POST:添加数据
    • DELETE:删除数据
    • PUT:修改数据
    • GET:查询数据
  • **【重要】**将具有唯一性的一些请求参数值设计到URL中,使之成为URL的一部分,例如:
    • https://blog.csdn.net/fgdfdr935219/article/details/10256542554

Spring MVC框架很好的支持了RESTful风格的程序设计:

  • 添加@RestController注解的控制器中,每个处理请求的方法默认都是响应正文的

  • 提供了@PostMapping@DeleteMapping@PutMapping@GetMapping注解,可以限制请求方式,或者,也可以通过@RequestMappingmethod属性来限制请求方式

    • 当匹配请求方式后,完全相同的URL,但是请求方式不同,是可以同时存在的
  • 在设计URL时,可以使用{}框住自定义名称,表示占位符,例如:/album/{id}/delete,其中的{id}就是占位符,并且,在设计处理请求的方法的参数时,相关的参数需要添加@PathVariable,则框架就知道从URL中取出参数值,作为调用处理请求的方法的参数

    • 注意:在URL中的{}占位符中的名称,与处理请求的方法的参数名称应该是相同的,如果不相同,则必须配置@PathVariable注解的参数,参数值就是URL中的占位符名称,例如:

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

关于RESTful风格的URL设计,在没有明确的要求的情况下,可以参考:

  • 查询列表/数据类型的复数,例如:/albums
  • 查询某个数据详情/数据类型的复数/id,例如:/albums/{id}
  • 针对某个数据的操作/数据类型的复数/id/操作,例如:/albums/{id}/delete

关于占位符的使用,可以在占位符名称的右侧添加冒号,并在冒号的右侧添加正则表达式,以限制匹配某些URL,例如:

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

当添加了正则表达式后,如果请求中的值不是数值类型,就会出现404错误。

在没有添加以上正则表达式之前,如果请求中的值不是数值类型,会出现400错误,这是接收到了请求并尝试转换请求参数格式时出现的错误,相比添加正则表达式导到的404错误,不添加正则表达式的400错误更加浪费服务器资源(虽然浪费得不多)。

**注意:**多个不冲突的正则表达式的配置是允许共存的!例如:

@PostMapping("/{id:[0-9]+}/delete")
public JsonResult deleteById(@PathVariable Long id) {
    // 尝试根据id删除数据
}

@PostMapping("/{name:[a-z]+}/delete")
public JsonResult deleteByName(@PathVariable String name) {
    // 尝试根据名称删除数据
}

当提交的请求中的占位符值是纯数字的,将对应"/{id:[0-9]+}/delete"路径,当占位符值是纯小写字母的,将对应"/{name:[a-z]+}/delete"路径。

当然,你不能再添加一个/{xxx:[0-9a-z]+}/delete的配置,因为如果这个配置与以上2个配置同时存在,当客户端提交的请求中的占位符值是纯数字的,或纯字母的,都可以同时匹配2个配置,则Spring MVC框架无法正确处理!

另外,没有使用占位符的,与已经使用占位符的,是可以同时存在的,例如:

@PostMapping("/test/delete")
public JsonResult deleteTest() {
    // 测试删除数据
}

@PostMapping("/{name:[a-z]+}/delete")
public JsonResult deleteByName(@PathVariable String name) {
    // 尝试根据名称删除数据
}

当提交的请求路径是/test/delete时,会匹配到以上上方的方法,即精准匹配。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值