什么是RESTful?通俗易懂解析

一,起源

  • REST全称是Representational State Transfer ,中文意思是表述性状态转移。

  • 于2000年首次被Roy Fielding的博士论文中出现,同时Roy Fielding也是HTTP
    1.1规范的主要编写人之一,(先有了该REST概念,后有了HTTP 1,1规范),该论文中明确指出REST指的是一组架构约束条件和原则( 很多人会误以为REST是一个新的技术,组件或服务,但其实全不是)。

那么什么是RESTful呢?

  • 如果一个应用程序的架构符合REST的约束条件和原则,就称之为RESTful架构。

另外REST本身受Web技术的影响很深,但是理论上REST架构风格并非是绑定在HTTP上的,而是因为目前HTTP是唯一与REST相关的实例,接下来要仔细讲解的REST也是通过HTTP实现的REST。

二,REST详解
REST的主要原则

  1. 一切皆资源
  2. 每个资源都具有唯一标识的资源标识符 URL
  3. 同一个资源具有多种表现形式,JSON,XML等 (通过Content-Type指定)
  4. 对各种资源的操作不会影响资源标识符
  5. 无状态操作

其中主要有如下约束和规范

  1. 客户端发送的数据指令都是“动词”+“宾语”的结构
    例如
    GET /users
    POST /users
    动词—请求方式,主要有如下几种,可以大致的与对数据的常见操作CRUD对应。
    GET :幂等 Read
    POST:不幂等 Create
    PUT :幂等 更新(Update)
    PATCH:幂等 部分更新(Update)
    DELETE :幂等 删除 (Delete)
    注:请求方式一律大写

  2. 宾语规范
    以上说完了动词,接下来就说说“宾语”,
    规范:宾语只能是名词
    例如:获取学生信息
    /getUser 不符合规范
    /users 规范,
    上面之所以采用复数,是因为获取的是一个数据集

  3. 减少资源层级关系
    在获取某一资源时,尽量使用查询字符串来替代多层级
    例如:获取武汉市洪山区的高级中学
    /city/2/area/3/schoolType/high
    建议规范:
    /city/2?area=3&schoolType=highschool
    查询已完成工作:
    /work/complete
    建议规范:
    /work?complete=true
    这样写的好处,利于扩展,接口语义表达明确,通俗易懂

  4. 状态码
    每当我们发送HTTP请求,都会获取到状态码+数据体。
    常见状态码:
    2XX 操作成功
    3XX 重定向
    4XX 客户端错误
    5XX 服务器错误
    一种逐渐向外扩散的倾向。

  5. 无状态&状态转移
    实际上,所谓的状态应该区分为应用状态和资源状态,客户端应用负责维护应用状态,服务端负责维护资源状态。而客户端与服务端的交互必须是无状态的。

例:
基于状态的Web服务,客户端与服务器交互的信息会保存在服务器的Session中,在这种前提下。客户端的请求就只能被保存有关用户相关状态信息的服务器所受理,这也就意味着,在基于状态的Web系统中服务器无法对用户请求进行负载均衡等操作(一个服务器只能处理特定的客户端请求)

在无状态的Web服务中,每一个Web请求都是独立的,请求之间完全分离,服务器不保存客户端的状态信息,每一个请求可以被任何一个可用的服务器受理,从而可以实现负载均衡等分布式系统特性

说到这里就再总结一下:
无状态请求:Server不保存任何请求状态信息,Client的每一个请求都具有可被执行等所需要的全部信息,所以能被任意可用的Server应答。
有状态请求:Server保存了Client的请求状态,Server会通过Client传递的SessionID在Server中的Session作用域找到之前交互的信息,并以此来实现应答。所以Client只能由某一个Server来应答。
此处关于无状态的解释,多参照于此篇
以上也就可以很好解释:
表述性状态转移中所谓的状态转移

特例:有些客户端比较老,只能支持GET和POST两种方法,
这时,我们可以给请求中加一个属性:
X-HTTP-Method-Overried
使用POST方式发送PUT请求:
加属性:
X-HTTP-Method-Overried:PUT即可指定此次请求是PUT请求,而非POST请求

三,SpringBoot中的RESTful实现
在SpringBoot中使用@RequestMapping注解的method属性实现了该规范:

//常见的请求方式
RequestMapping(method=RequestMethod.GET)
RequestMapping(method=RequestMethod.POST)
RequestMapping(method=RequestMethod.DELETE)
RequestMapping(method=RequestMethod.PUT)
//SpringBoot支持的请求方式,看源码
public enum RequestMethod {

	GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE

}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值