【问题标题】:What URL should be used to update a property of all members of a collection应该使用哪个 URL 来更新集合的所有成员的属性
【发布时间】:2015-09-13 21:08:20
【问题描述】:

我将旧版 CLI 接口封装到 Web 服务/接口中(使用 JAX-RS)并尽可能使用 REST 样式。

该服务管理实体集合的 CRUD,以及一个额外的 [de]activate 操作对,它更改实体的 active 状态和属性。

对于单个实体,我已将激活/停用实现为:

Content-Type: text/plain
PUT /entities/{identifier}/active
DATA "true"|"false" 
RESPONSE 303 Location: /entity/{identifier}

但是,CLI 还提供了一个有用的操作来一次激活/停用所有实体。这实际上是一个全局批量更新操作,因为它(可能)改变集合中每个实体的状态。

我正在寻找有关如何最好地使用 URL 表达此类全局操作的建议。我认为没有 RESTful 方式来表达它们,但很高兴得到纠正。是否有任何普遍接受或标准的 URL 样式?

到目前为止,对于我正在使用的全局操作...

POST /entities/activate
POST /entities/deactivate
RESPONSE 204

...我意识到这不是远程 RESTful,但至少具有易于人类客户理解和调用的好处。我正在寻找一种更好的、希望是标准的方法来改进这一点。

(我也考虑过使用/entities/all 伪元素,但认为它使服务器端的事情变得更加复杂,对客户端没有任何好处。)

回顾一下:

  • 我有一个名为 entities 的资源,它代表一个集合。
  • 每个成员都是一个entity,由其{identifier} 标识。
  • 每个实体都有许多属性,包括一个布尔状态属性:active
  • 可以通过调用操作来激活和停用每个实体。
  • 对于单个实体,我通过entities/{identifier}/active 上的 POST(或 PUT)公开该操作。
  • 我认为这是合理的。
  • 我想公开另一个操作,它激活/停用集合的所有成员。
  • 我正在寻找一种标准方法来表达这两个全局操作,它们会在 URL 中更改集合的所有成员的状态。

更新

根据 Jon 的建议,实体集合所有成员的激活/停用操作应变为:

Content-Type: text/plain
PUT /entities/active
DATA "true"|"false" 
RESPONSE 204

【问题讨论】:

  • 这个问题似乎是关于为您的 URL 选择最佳名称,所以这似乎主要是一个意见问题,对吧?
  • @Maximillian 也许是这样。但我要问的是,对于这个普遍问题,是否有任何公认的或标准的方法。

标签: rest http


【解决方案1】:

/entities/activate 代表什么。那东西和/entities/deactivate 有什么不同?如果我正在做一些改变它们 (PUT) 或作用于它们 (POST) 的操作,为什么我不能使用相同的资源来激活和停用?

这似乎没有多大意义。您似乎正在使用 URI 来识别操作。

但是,/entities/all 至少具有对单个资源使用单个标识符的优势(没有什么“伪”,它与您制作的任何其他资源一样真实)。

/entities/ 可能会更好。这很常见,但肯定不是必需的,并且通常很有用(由于能够使用常见的相对 URI 路径,如 ../),让路径组件中的上一步标识符标识一组相关实体的总数。

所以,让/entities/[some id]/ 识别给定实体,并让PUT 将其描述为活动或非活动以更改它。然后让/entities/ 代表所有这些,PUT 代表它们全部处于活动状态或全部处于非活动状态以将它们全部设置为这样的事实。

【讨论】:

  • 好的,谢谢。因此,您建议使用显式“所有”(伪)成员或集合资源名称本身作为更改集合所有成员状态的操作的目标。有任何证据表明这是一种常见的方法吗?
  • 打开服务器上的目录浏览。转到浏览器中的目录。请注意,您收到的实体描述的资源是所包含资源的集合。这是相同的原理。您的/entities/{identifier}/active 是一个坏主意,这是一个相关原则; /entities/{identifier}/active 是什么东西?
  • 我有一个名为entities 的资源,它代表一个集合。每个成员都是一个entity,由其{identifier} 标识。每个实体都有一个布尔状态属性:active,可以通过调用操作来激活和停用。我正在通过entities/{identifier}/active 上的 POST(或 PUT)公开该操作。我认为这是合理的。我的查询是关于全局操作(激活/停用集合的所有成员)。
  • 啊。我读到它暗示你有一个反对的/deactivate,因此使用URI 来标识操作而不是实体。回到一般情况,“更高层”的集合资源是 HTTP 中长期存在的方法,唯一的新方法是为 PUT 定义一个仅代表部分更改的实体。发布可能会少一些争议。 /entities/are_all_active 可能有一个很好的论据,您可以更改以类似地影响所有它们,这将有一个优势,可以让您在某个地方 GET 发现...
  • 快速查看它们是否全部、部分或全部处于活动状态。无论哪种方式,PUT 都有一个很好的优势,因为在 HTTP 使用这个词的意义上,操作本质上是幂等的;将它们全部激活并再次将它们全部激活,效果就像你只做了一次一样。将它们全部设置为非活动状态,然后再次将它们全部设置为非活动状态,效果就像你只做了一次一样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-09-07
  • 1970-01-01
  • 1970-01-01
  • 2014-03-25
  • 1970-01-01
  • 1970-01-01
  • 2015-07-09
相关资源
最近更新 更多