何为 REST?与如何构建 REST?

本贴最后更新于 1664 天前,其中的信息可能已经时移俗易

表现层状态转换 REST 是 Representational State Transfer 的缩写,是 Roy Thomas Fielding 博士于 2000 年在他的博士论文中提出来的一种万维网软件架构风格,目的是便于不同软件/程序在网络(例如互联网)中互相传递信息。表现层状态转换是根基于超文本传输协议(HTTP)之上而确定的一组约束和属性,是一种设计提供万维网络服务的软件构建风格。符合或兼容于这种架构风格(简称为 REST 或 RESTful)的网络服务,允许客户端发出以统一资源标识符访问和操作网络资源的请求,而与预先定义好的无状态操作集一致化。因此表现层状态转换提供了在互联网络的计算系统之间,彼此资源可交互使用的协作性质(interoperability)。相对于其它种类的网络服务,例如 SOAP 服务,则是以本身所定义的操作集,来访问网络上的资源。

要点及标准

REST 是设计风格而不是标准。REST 通常基于使用 HTTP、URI、XML 以及 HTML 这些现有的广泛流行的协议和标准。

  • 资源是由 URI 来指定。
  • 对资源的操作包括获取、创建、修改和删除,这些操作正好对应 HTTP 协议提供的 GET、POST、PUT 和 DELETE 方法。
  • 通过操作资源的表现形式来操作资源。
  • 资源的表现形式则是 XML 或者 HTML,取决于读者是机器还是人、是消费 Web 服务的客户软件还是 Web 浏览器。当然也可以是任何其他的格式,例如 JSON。
  • 统一接口(Uniform Interface)

REST 架构的限制条件

  • 客户端-服务器(Client-Server)
    客户端-服务器结构限制的目的是将客户端和服务器端的关注点分离. 将用户界面所关注的逻辑和数据存储所关注的逻辑分离开来有助于提高用户界面的跨平台的可移植性.通过简化服务器模块也有助于服务器模块的可扩展性.
  • 无状态(Stateless)
    服务器不能保存客户端的信息, 每一次从客户端发送的请求中, 要包含所有的必须的状态信息, 会话信息由客户端保存, 服务器端根据这些状态信息来处理请求. 服务器可以将会话状态信息传递给其他服务, 比如数据库服务, 这样可以保持一段时间的状态信息, 从而实现认证功能. 当客户端可以切换到一个新状态的时候发送请求信息. 当一个或者多个请求被发送之后, 客户端就处于一个状态变迁过程中. 每一个应用的状态描述可以被客户端用来初始化下一次的状态变迁.
  • 缓存(Cacheability)
    如同万维网一样, 客户端和中间的通讯传递者可以将回复缓存起来. 回复必须明确的或者间接的表明本身是否可以进行缓存, 这可以预防客户端在将来进行请求的时候得到陈旧的或者不恰当的数据. 管理良好的缓存机制可以减少客户端-服务器之间的交互, 甚至完全避免客户端-服务器交互, 这进一步提了高性能和可扩展性。
  • 统一接口(Uniform Interface)
    这是 RESTful 系统设计的基本出发点. 它简化了系统架构, 减少了耦合性, 可以让所有模块各自独立的进行改进. 包括下列四个限制:

image.png

  • 客户端一般不知道是否直接连接到了最终的服务器, 或者是路径上的中间服务器. 中间服务器可以通过负载 均衡和共享缓存的机制提高系统的可扩展性,这样可也便于安全策略的部署.分层系统(Layered System)

关于状态

应该注意区别应用的状态和连接协议的状态。HTTP 连接是无状态的(也就是不记录每个连接的信息),而 REST 传输会包含应用的所有状态信息,因此可以大幅降低对 HTTP 连接的重复请求资源消耗。

将 REST 应用于 WEB 服务中

符合 REST 设计风格的 Web API 称为 RESTful API。

RESTful API 的定义标准

image.png

下表列出实现 RESTful API 时 HTTP 请求方法的典型例子

image.png

PUT 和 DELETE 方法是幂等方法。

GET 方法是安全方法(不会对服务器端有修改,因此当然也是幂等的)。

不像基于 SOAP 的 Web 服务,RESTful Web 服务并没有“正式”的标准。这是因为 REST 是一种架构,而 SOAP 只是一个协议。

虽然 REST 不是一个标准,但大部分 RESTful Web 服务实现会使用 HTTP、URI、JSON 和 XML 等各种标准。

实现举例

image.png

REST 的优点

  • 可更高效利用缓存来提高响应速度
  • 通讯本身的无状态性可以让不同的服务器的处理一系列请求中的不同请求,提高服务器的扩展性
  • 浏览器即可作为客户端,简化软件需求
  • 相对于其他叠加在 HTTP 协议之上的机制,REST 的软件依赖性更小
  • 不需要额外的资源发现机制
  • 在软件技术演进中的长期的兼容性更好
  • RESTful

    一种软件架构设计风格而不是标准,提供了一组设计原则和约束条件,主要用于客户端和服务器交互类的软件。基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机制。

    30 引用 • 114 回帖 • 2 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...