RESTful单例资源

时间:2011-12-08 16:00:04

标签: rest singleton

我来自RPC世界,但目前正在调查是否使用REST对我的项目来说是一个好主意。至于我从Wikipedia了解到,RESTful服务的基本思想是提供对集合及其各个元素的访问。

在我的情况下,服务器将是一个测量仪器。我必须能够启动,停止和暂停测量程序,并随时读取数据。

目前,我正在考虑以下事项:

  • POST /测量(开始测量,这一直持续到用户停止)
  • PUT / measure pause = true / false(暂停/取消暂停)
  • 删除/衡量(停止)
  • 获取/衡量(获取测量数据)

但是,我不确定这是否适合REST模型,因为我在这里并不真正使用集合或元素。

我的问题:如何访问单例资源并对服务器执行启动/停止请求会破坏RESTful无状态约束?

3 个答案:

答案 0 :(得分:10)

非RESTful

不,您的方法不是RESTful,因为如果我了解工作流程,您将删除资源以停止测量,然后让资源读出最终结果。但删除资源意味着GET没有任何内容。

您的资源是单身的事实根本不是问题。问题在于你如何映射动词和状态。

你的描述有点抽象,所以让我们更具体一点:让我们假设所讨论的乐器以弧度/秒为单位测量飞轮的角速度。该仪器具有与测量相关的一些成本,因此客户需要能够在一段时间内禁用测量作为节省成本的措施。如果这与您的场景大致类似,那么下面的说明应该适用于您的场景。

动词

现在,让我们回顾你的动词。

GET返回资源的表示。因此,当您GET /measure时,它应返回一些代表当前测量值的数据。

PUT创建或更新特定的命名资源。资源由其URL命名。因此,PUT /measure意味着您要更新名为/measure的资源的状态,或者创建该资源(如果该资源尚未存在)。在您的情况下,仪器值是只读的:我们不能将弧度/秒值写入仪器。但是乐器的暂停/活动状态是可变的,因此PUT /measure应该包含一个修改乐器状态的主体。你可以在这里使用很多不同的表示形式,但是一个简单的方法就是像active=trueactive=false这样的请求体,来表明你的新工具应该是什么样的。

POSTPUT类似,不同之处在于客户端未指定应创建或更新的资源的名称。例如,在不同的API中,客户端可能POST /articles创建一篇新文章。服务器将创建一个资源,并为其命名为/articles/1234,然后通过返回201 CREATED HTTP代码并添加Location: /articles/1234标头告诉客户端这个新名称。新资源所在的客户端。在您的方案中,POST不是一个有意义的动词,因为您始终知道您的单例资源的名称是什么。

DELETE表示您删除资源,并且由于资源是通过网址标识的,因此DELETE /measure表示/measure不再存在。后续GET /measure应返回404 NOT FOUND410 GONE。在您的情况下,客户实际上无法销毁该工具,因此DELETE并不是一个有意义的动词。

结论

总而言之,为您的服务设计的RESTful设计是PUT /measure有一个请求体,告诉仪器它应该是活动的还是不活动的(暂停的)和GET /measure来读取电流测量。如果您在暂停的工具上GET /measure,则应该返回409 CONFLICT HTTP状态。您的服务根本不应使用POSTDELETE

答案 1 :(得分:1)

你还在处理资源,你打破它的方式对我来说听起来不错。菲尔丁在REST chapter中明确提到了临时服务:

  

REST中信息的关键抽象是一种资源。任何   可以命名的信息可以是资源:文档或图像,   临时服务(例如“洛杉矶今天的天气”)

虽然为每个测量提供一个独特的ID可能是有意义的。这样你就可以唯一地参考每个测量(你甚至不需要存储旧的测量,但是如果有人提到旧的测量,你可以告诉他们,他们要求的东西不再是最新的)。

答案 2 :(得分:1)

以最后的答案为基础。以下是您可能想要分解的方法

  • 措施/ - 从工具中获取所有措施(如果需要,根据查询参数进行分页/限制)
  • measure /:measure_id - 获取特定措施
  • 措施/ - POST - 开始新措施。这将返回您稍后可以处理的新度量ID。
  • measure /:measure_id - DELETE - 停止测量。
  • measure /:measure_id - PUT - 更新度量
  • measures / last_measure - 上次测量的资源。