我来自RPC世界,但目前正在调查是否使用REST对我的项目来说是一个好主意。至于我从Wikipedia了解到,RESTful服务的基本思想是提供对集合及其各个元素的访问。
在我的情况下,服务器将是一个测量仪器。我必须能够启动,停止和暂停测量程序,并随时读取数据。
目前,我正在考虑以下事项:
但是,我不确定这是否适合REST模型,因为我在这里并不真正使用集合或元素。
我的问题:如何访问单例资源并对服务器执行启动/停止请求会破坏RESTful无状态约束?
答案 0 :(得分:10)
不,您的方法不是RESTful,因为如果我了解工作流程,您将删除资源以停止测量,然后让资源读出最终结果。但删除资源意味着GET
没有任何内容。
您的资源是单身的事实根本不是问题。问题在于你如何映射动词和状态。
你的描述有点抽象,所以让我们更具体一点:让我们假设所讨论的乐器以弧度/秒为单位测量飞轮的角速度。该仪器具有与测量相关的一些成本,因此客户需要能够在一段时间内禁用测量作为节省成本的措施。如果这与您的场景大致类似,那么下面的说明应该适用于您的场景。
现在,让我们回顾你的动词。
GET
返回资源的表示。因此,当您GET /measure
时,它应返回一些代表当前测量值的数据。
PUT
创建或更新特定的命名资源。资源由其URL命名。因此,PUT /measure
意味着您要更新名为/measure
的资源的状态,或者创建该资源(如果该资源尚未存在)。在您的情况下,仪器值是只读的:我们不能将弧度/秒值写入仪器。但是乐器的暂停/活动状态是可变的,因此PUT /measure
应该包含一个修改乐器状态的主体。你可以在这里使用很多不同的表示形式,但是一个简单的方法就是像active=true
或active=false
这样的请求体,来表明你的新工具应该是什么样的。
POST
与PUT
类似,不同之处在于客户端未指定应创建或更新的资源的名称。例如,在不同的API中,客户端可能POST /articles
创建一篇新文章。服务器将创建一个资源,并为其命名为/articles/1234
,然后通过返回201 CREATED
HTTP代码并添加Location: /articles/1234
标头告诉客户端这个新名称。新资源所在的客户端。在您的方案中,POST
不是一个有意义的动词,因为您始终知道您的单例资源的名称是什么。
DELETE
表示您删除资源,并且由于资源是通过网址标识的,因此DELETE /measure
表示/measure
不再存在。后续GET /measure
应返回404 NOT FOUND
或410 GONE
。在您的情况下,客户实际上无法销毁该工具,因此DELETE
并不是一个有意义的动词。
总而言之,为您的服务设计的RESTful设计是PUT /measure
有一个请求体,告诉仪器它应该是活动的还是不活动的(暂停的)和GET /measure
来读取电流测量。如果您在暂停的工具上GET /measure
,则应该返回409 CONFLICT
HTTP状态。您的服务根本不应使用POST
或DELETE
。
答案 1 :(得分:1)
你还在处理资源,你打破它的方式对我来说听起来不错。菲尔丁在REST chapter中明确提到了临时服务:
REST中信息的关键抽象是一种资源。任何 可以命名的信息可以是资源:文档或图像, 临时服务(例如“洛杉矶今天的天气”)
虽然为每个测量提供一个独特的ID可能是有意义的。这样你就可以唯一地参考每个测量(你甚至不需要存储旧的测量,但是如果有人提到旧的测量,你可以告诉他们,他们要求的东西不再是最新的)。
答案 2 :(得分:1)
以最后的答案为基础。以下是您可能想要分解的方法