【发布时间】:2020-01-24 20:26:26
【问题描述】:
请注意 Roy Fielding 关于 REST 设计、指南和原则的以下内容。
5.2.1.1 资源和资源标识符
REST 中信息的关键抽象是资源。任何 可以命名的信息可以是资源:文档或图像, 临时服务(例如“洛杉矶今天的天气”), 其他资源的集合,一个非虚拟对象(例如一个人), 等等。换句话说,任何可能成为目标的概念 作者的超文本参考必须符合 a 的定义 资源。
资源是到一组实体的概念映射,而不是 对应于任何特定点的映射的实体 时间。
更准确地说,资源 R 是一个随时间变化的成员 函数 MR(t),它在时间 t 映射到一组实体或值, 这是等价的。集合中的值可能是资源 表示和/或资源标识符。资源可以映射到 空集,允许在任何之前对概念进行引用 存在这个概念的实现——一个陌生的概念 Web [61] 之前的大多数超文本系统。有些资源是 静态的意思是,当在他们之后的任何时间检查时 创建时,它们总是对应于相同的值集。其他人有一个 随着时间的推移,它们的价值差异很大。
对于资源来说,唯一要求是静态的就是 映射的语义,因为语义是区别 一种资源来自另一种资源。
关键点已加粗,我包含的其余段落是为了上下文。
这是场景。
我有一个具有端点的 Web api:http://www.myfakeapi.com/people
当客户端向此端点发出 GET 请求时,他们会收到一个人员列表。
Person
{
"Name": "John Doe",
"Age": "23",
"Favorite Color": "Green"
}
好的,那很酷。
但是,如果我有一个没有最喜欢的颜色的“人”并且我想像这样返回它们,这是否违反了 REST 设计实践和原则:
Person
{
"Name": "Bob Doe",
"Age": "23",
}
或者我应该这样退回它们:
Person
{
"Name": "Bob Doe",
"Age": "23",
"Favorite Color": null
}
问题是请求资源的客户端必须做额外的工作才能首先查看该属性是否存在。有些“人”有最喜欢的颜色,有些则没有。如果 'Favorite Color' 的 json 属性不存在,则忽略它们是否违反 REST 原则 - 还是应该为该属性赋予“null”或空白值?
REST 对此有何看法?我在想我应该返回一个 null 而不是通过 省略 属性来更改客户端请求的资源的表示。
【问题讨论】:
-
一个 HTML 页面是否因为它不包含表单元素而无效,即使媒体类型声明可能有一些?换句话说,您只能返回您所拥有的信息。您是否包含一些任意的后备值是您的设计选择或您交换消息的媒体类型的详细信息。请注意,我将此问题标记为主要是固执己见,因为对此没有明确的答案,并且基本上归结为个人喜好
-
一种不同的类比,但真正的问题是 - 如果客户期望一个具有三个属性的 JSON 对象,但有时我决定向他发送相同的对象但具有两个属性,这是 1) 这违反了 REST,并且 2) 不好的做法?我了解添加属性是如何很好的,因为这是一个非破坏性更改,省略属性似乎肯定是一个“破坏性更改”,或者我很困惑?
-
首先要澄清的是,REST 不是协议,因此您不能违反它。 REST 只是一组约束,如果不正确遵循这些约束,将无法提供 REST 所追求的好处。接下来,客户端会被服务器教授他们需要知道的一切。一个表单,即将教客户端预期的数据元素、服务器期望的表示、发送有效负载的方法以及发送数据的端点。客户在任何时候都不需要查阅外部文档。
-
如果客户端希望在响应中接收某些字段,它可能认为资源具有certain type,根据Fielding 本人的说法,客户端不应该这样做,因为这只是引入了一个客户端与特定 API 的紧密耦合,不允许同一个客户端轻松与不同的 API 交互