RESTful单例资源

Sun*_*dae 10 rest singleton

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

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

目前,我正在考虑以下内容:

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

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

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

Mar*_*ase 12

不RESTful

不,您的方法不是RESTful,因为如果我了解工作流程,您将删除资源以停止测量,然后获取资源以读取最终结果.但删除资源意味着没有任何东西可以留下GET.

您的资源是单例的事实根本不是问题.问题在于你映射动词和状态的方式.

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

动词

现在,我们来看看你的动词.

GET返回资源的表示.所以,当你GET /measure,它应该返回一些代表当前测量的数据.

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

POST类似于PUT,除了客户端没有指定应该创建或更新的资源的名称.例如,在不同的API中,客户端可能会POST /articles创建一篇新文章.服务器将创建一个资源并为其命名 /articles/1234,然后通过返回201 CREATEDHTTP代码并添加Location: /articles/1234标头告诉客户端新资源的位置,它将告诉客户端这个新名称.在您的场景中,POST不是一个有意义的动词,因为您总是知道您的单例资源的名称是什么.

DELETE表示您删除资源,并且由于资源由URL标识,DELETE /measure表示/measure不再存在.后续GET /measure应该返回404 NOT FOUND410 GONE.在你的情况下,客户端实际上不能销毁仪器,所以DELETE没有意义的有意义的动词.

结论

总而言之,为您的服务设计的RESTful设计将是PUT /measure一个请求体,它告诉仪器它应该是活动的还是不活动的(暂停的)并GET /measure读取当前的测量值.如果您GET /measure使用暂停的仪器,则应该返回409 CONFLICTHTTP状态.您的服务不应使用POST或根本不使用DELETE.


Daf*_*aff 2

您仍在开发资源,并且您分解资源的方式对我来说听起来不错。Fielding 在REST 章节中明确提到了临时服务:

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

也许给每个测量一个唯一的 ID 是有意义的。这样您就可以唯一地引用每个测量值(您甚至不必存储旧的测量值,但如果有人引用旧的测量值,您可以告诉他们,他们所请求的内容不再是最新的)。