RESTful单例资源

RESTful单例资源,rest,singleton,Rest,Singleton,我来自RPC世界,但目前正在调查使用REST是否适合我的项目。据我所知,RESTful服务的基本思想是提供对集合及其各个元素的访问 在我的情况下,服务器将是一个测量仪器。我必须能够启动、停止和暂停测量例程,并随时读取数据 目前,我正在考虑以下事项: POST/measure(开始测量,直到用户停止) PUT/measurepause=true/false(暂停/取消暂停) 删除/测量(停止) 获取/测量(获取测量数据) 但是,我不确定这是否适合REST模型,因为我在这里并不真正处理集合或元素

我来自RPC世界,但目前正在调查使用REST是否适合我的项目。据我所知,RESTful服务的基本思想是提供对集合及其各个元素的访问

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

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

  • POST/measure(开始测量,直到用户停止)
  • PUT/measurepause=true/false(暂停/取消暂停)
  • 删除/测量(停止)
  • 获取/测量(获取测量数据)
但是,我不确定这是否适合REST模型,因为我在这里并不真正处理集合或元素


我的问题:我如何访问单例资源,以及如何使对服务器的启动/停止请求打破RESTful无状态约束?

您仍在处理资源,您打破资源的方式听起来不错。Fielding在以下内容中明确提到临时服务:

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


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

基于最后一个答案。下面是您可能希望将其分解的方式

  • 测量值/-从仪器获取所有测量值(如果需要,根据查询参数进行分页/限制)
  • measures/:measure_id-获取特定度量值
  • measures/-POST-启动一个新的度量。这将返回新的度量值ID,您可以稍后处理它
  • measures/:measure_id-DELETE-停止测量
  • measures/:measure_id-PUT-更新度量值
  • 测量值/最后测量值-最后测量的资源
不安静 不,您的方法不是RESTful,因为如果我理解工作流,您将删除资源以停止测量,然后让资源读取最终结果。但是删除一个资源意味着将没有任何东西可供
获取

事实上,您的资源是一个单体,这一点都不是问题。问题在于你映射动词和状态的方式

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

动词 现在,让我们复习一下你的动词

GET
返回资源的表示形式。因此,当您
GET/measure
时,它应该返回一些表示当前度量的数据

PUT
创建或更新特定的命名资源。资源由其URL命名。因此,
PUT/measure
意味着您正在更新名为
/measure
的资源的状态,或者如果该资源不存在,则创建该资源。在您的情况下,仪器值是只读的:我们无法将弧度/秒值写入仪器。但是仪器的暂停/激活状态是可变的,因此
PUT/measure
应包括一个修改仪器状态的主体。您可以在这里使用许多不同的表示,但一种简单的方法是请求主体,如
active=true
active=false
,以指示W仪器的新状态

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

DELETE
表示删除资源,由于资源由URL标识,
DELETE/measure
表示
/measure
不再存在。后续的
GET/measure
应返回
404未找到
410已消失
。在您的情况下,客户机实际上无法销毁仪器,因此
DELETE
不是一个有意义的动词

结论
因此,总之,您的服务的RESTful设计将具有
PUT/measure
,请求主体告知仪器是否应处于活动状态(暂停),以及
GET/measure
读取当前测量值。如果在暂停的仪器上执行
GET/measure
,则可能会返回
409冲突
HTTP状态。您的服务根本不应该使用
POST
DELETE

属于我的观点,因为这更像是一个设计问题。看来我走对了方向。但是,我的应用程序需要控制并反映机器的当前状态(即测量或不测量),但这可能不是问题。id也可能反映您正在测量的内容(例如天气/洛杉矶)。但我想说的是你可以留着它