我对REST的理解使得可以将服务操作建模为状态的表示,并使用HTTP从一种状态转换为另一种状态。直到最近,当我阅读Jimmy Bogard的这篇文章时,我一直将资源理解为服务端状态的代表,我知道他是一个受到社区尊重的聪明的开发人员/架构师。引用该帖子的特定声明
表示形式有所不同–它描述了资源的当前状态(在请求时)。
这让我感到困惑。关于该主题的普遍看法是什么?
我对REST的理解使得可以将服务操作建模为状态的表示,并使用HTTP从一种状态转换为另一种状态。直到最近,当我阅读Jimmy Bogard的这篇文章时,我一直将资源理解为服务端状态的代表,我知道他是一个受到社区尊重的聪明的开发人员/架构师。引用该帖子的特定声明
表示形式有所不同–它描述了资源的当前状态(在请求时)。
这让我感到困惑。关于该主题的普遍看法是什么?
Answers:
简短答案
地图不是领土。
更长的答案-与任何REST一样,开始的地方是Roy Fielding的论文;特别是第5章。对于当前问题,您需要第5.2.1节。
REST由四个接口约束定义:资源标识;通过表述操纵资源;自我描述的信息;超媒体作为应用程序状态的引擎。
资源资源
REST中信息的关键抽象是一种资源。可以命名的任何信息都可以是资源:文档或图像,临时服务(例如“洛杉矶今天的天气”),其他资源的集合,非虚拟对象(例如人)等。换句话说,任何可能成为作者超文本引用目标的概念都必须符合资源的定义。资源是到一组实体的概念映射,而不是在任何特定时间点与该映射相对应的实体。
表示
REST组件通过使用表示来捕获资源的当前或预期状态并在组件之间传输该表示,从而对资源执行操作。表示形式是字节序列,外加描述这些字节的表示形式元数据。表示形式的其他常用但不太精确的名称包括:文档,文件和HTTP消息实体,实例或变体。
表示形式包括数据,描述数据的元数据,有时还包括描述元数据的元数据(通常用于验证消息完整性)。
因此:“洛杉矶今天的天气”是一种资源。候选人代表将包括:一份文本文件,其中包含国家气象局的最新预报;气象雷达的可视化表示和天气预报的录音。
资源就是您正在使用的东西。例如,如果您有用于切换特定灯的API,则资源就是灯本身。资源可以是物理的(例如,灯,人)或非物理的(例如,物品,角色,数据库中的一行),资源可以是主要的(例如,余额)或派生的(例如,交易)。资源可以引用特定的实体(例如,安装在此灯插座中的第五个灯),也可以引用在不同时间映射到不同实体的角色(例如,当前安装的灯,即2008年8月5日安装的灯)或者它可以映射到多个实体(例如,房屋中的所有灯)。
资源的表示形式是您的服务传达资源状态的方式,例如表示灯状态的XML,JSON。
在REST API中,资源由统一标识符(例如URI)标识。单个资源可以具有多个表示形式,在HTTP REST API中,通常需要在HTTP Content-Type和Accept标头中指示要使用的表示形式。
客户端服务器体系结构中的一项关键实现是,您无法将资源带给客户端,并且您不应该像尝试的那样尝试进行配置。相反,在REST API中,您可以通过传输资源的表示来远程操纵资源。可以这样想,您不必联邦快递灯,以便客户端可以直接操纵灯,而是服务创建灯的XML / JSON / protobuf / CSV表示,并且客户端发送预期操作的表示。然后,该服务代表客户操纵灯的实际状态,或者拒绝请求,例如,如果客户无权在灯上进行操作。这看起来似乎是明显的/分散的头发,但是要注意的重要一点是,由于表示形式不是资源本身,
资源可能是发票。
表示形式是特定时间点的JSON格式或XML格式的发票。您稍后可能会获得与发票完全相同的发票,它将是相同的资源,但是处于潜在的不同状态(已取消,已付款等)。
您获取发票的当前状态(例如:数据库中的所有发票数据),并在特定的时间点为其提供特定的表示形式(例如:html,xml,json),以传输到其他设备(例如:浏览器)