应使用什么URL来更新集合的所有成员的属性

时间:2015-09-13 21:08:21

标签: rest http

我将旧的CLI界面包装到Web服务/接口(使用JAX-RS)并尽可能使用REST样式。

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

对于单个实体,我已将activate / deactivate实现为:

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

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

我正在寻找有关如何最好地通过网址表达此类全局操作的建议。我认为没有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

1 个答案:

答案 0 :(得分:1)

/entities/activate代表什么。这件事与/entities/deactivate有什么不同?如果我正在做一些改变它们(PUT)或对它们采取行动(POST)的事情,为什么我不能使用相同的资源来激活和停用?

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

然而,/entities/all至少具有为单个资源使用单个标识符的优势(没有任何内容"伪"关于它,它不会真实比你制作的任何其他资源都多。)

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

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