Cowboy 用户指南 (十七) - REST 原理

REST 原理

本章将尝试定义REST背后的概念,并解释什么使服务具有RESTful。

REST常常与根据HTTP方法执行不同的操作相混淆,同时使用的方法比GET和POST方法更多。这充其量是一种高度误导。

我们将首先尝试定义REST,并研究它在HTTP和Web上下文中的含义。要想更深入地解释REST,你可以阅读Roy T. Fielding's dissertation ,因为它很好地解释了REST的来源和成就。

REST 架构

REST是一种客户机-服务器架构。客户端和服务器都有不同的关注点。服务器存储和/或操作信息,并使其以一种有效的方式对用户可用。客户端获取该信息并将其显示给用户和/或使用它来执行后续的信息请求。这种关注点分离允许客户端和服务器独立地发展,因为它只要求接口保持不变。

REST 是无状态的。这意味着客户机和服务器之间的通信总是包含执行请求所需的所有信息。服务器中没有会话状态,它完全保存在客户端。如果访问资源需要身份验证,那么客户机需要对每个请求进行身份验证。

REST 是可缓存的。客户端、服务器和任何中介组件都可以缓存资源,以提高性能。

REST提供了组件之间的统一接口。这简化了体系结构,因为所有组件都遵循相同的规则来相互通信。它还使理解系统不同组件之间的交互变得更容易。要实现这一点,需要一些约束条件。它们将在本章的其余部分进行讨论。

REST是一个分层的系统。单个组件无法看到与它们交互的直接层之外的内容。这意味着连接到中间组件(如代理)的客户机不知道后面是什么。这允许组件是独立的,因此很容易替换或扩展。

REST可选地按需提供代码。可以下载代码来扩展客户端功能。然而,这是可选的,因为客户端可能无法下载或运行此代码,因此REST组件不能依赖于它的执行。

资源和资源标识符

资源是一个抽象的概念。在REST系统中,任何可以命名的信息都可以是资源。这包括文档、图像、资源集合和任何其他信息。任何可以作为超文本链接目标的信息都可以是资源。

资源是到一组实体的概念映射。实体的集合随着时间的推移而演变;一个资源没有。例如,一个资源可以映射到“上个月登录的用户”,另一个映射到“所有用户”。在某些时候,它们可能映射到同一组实体,因为所有的用户都是在过去一个月登录的。但它们仍然是不同的资源。类似地,如果最近没有人登录,那么第一个资源可能映射到空集。无论该资源映射到什么信息,它都存在。

资源由统一资源标识符(也称为URI)标识。有时也可以使用国际化资源标识符(IRIs),但是可以直接将其转换为URI。

在实践中,我们将确定两种资源。单个资源映射到一个元素的集合,例如“user Joe”。资源集合映射到0到N个元素的集合,例如“所有用户”。

资源表示形式

资源的表示是与元数据(metadata)相关联的字节序列。

元数据作为键-值对的列表出现,其中名称对应于定义值结构和语义的标准。使用HTTP,元数据以请求或响应报头的形式出现。报头的结构和语义在HTTP标准中得到了很好的定义。元数据包括表示元数据、资源元数据和控制数据。

表示元数据提供有关表示的信息,比如它的媒体类型、最后修改的日期,甚至是校验和。

资源元数据可以链接到相关资源或关于资源的其他表示形式的信息。

控制数据允许参数化请求或响应。例如,我们可能只希望返回比我们在缓存中拥有的最近的表示。类似地,我们可能想要指示客户机应该如何缓存表示。这并不局限于缓存。例如,我们可能想要存储一个资源的新表示,只有当它在我们第一次检索它时没有被修改。

表示的数据格式也称为媒体类型。一些媒体类型用于直接呈现给用户,而另一些用于自动处理。媒体类型是REST体系结构的关键组件。

自我描述信息

信息必须是自我描述的。这意味着表示的数据格式必须总是伴随着它的媒体类型(类似地,请求资源涉及到选择返回的表示的媒体类型)。如果您正在发送HTML,那么您必须通过发送带有表示的媒体类型来说明它是HTML。在HTTP中,这是使用content-type头来完成的。

媒体类型通常是IANA注册的媒体类型,如text/html或 image/png,但不需要这样。要遵守这个约束,只有两件事是重要的:媒体类型得到了很好的指定,以及发送方和接收方对媒体类型所指的内容达成一致。

这意味着您可以创建自己的媒体类型,如application/x-mine,并且只要您为它编写规范,并且两个端点都同意它,那么约束就会得到尊重。

超媒体作为应用状态的引擎

最后一个约束通常是声称是RESTful的服务失败的地方。与服务器的交互必须完全由超媒体驱动。为了使用它,客户端不需要任何关于服务的预先知识,除了一个入口点和对表示的媒体类型的基本理解,至少需要足够的知识来查找和标识超链接和链接关系。

举个简单的例子,如果你的服务只与application/json媒体类型一起工作,那么这个约束就不能被尊重(因为json中没有链接的概念),因此你的服务不是RESTful的。这是大多数自封的REST服务的情况。

另一方面,如果您创建的基于JSON的媒体类型具有链接和链接关系的概念,那么您的服务可能是RESTful的。

尊重这个约束意味着服务的整体变得可以自我发现,不仅包括其中的资源,还包括您可以对其执行的操作。这使得客户机非常瘦,因为不需要实现特定于服务的任何东西来对其进行操作。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值