RESTful单例资源
我来自RPC世界,但目前正在调查使用REST是否适合我的项目。据我所知,RESTful服务的基本思想是提供对集合及其各个元素的访问 在我的情况下,服务器将是一个测量仪器。我必须能够启动、停止和暂停测量例程,并随时读取数据 目前,我正在考虑以下事项:RESTful单例资源,rest,singleton,Rest,Singleton,我来自RPC世界,但目前正在调查使用REST是否适合我的项目。据我所知,RESTful服务的基本思想是提供对集合及其各个元素的访问 在我的情况下,服务器将是一个测量仪器。我必须能够启动、停止和暂停测量例程,并随时读取数据 目前,我正在考虑以下事项: POST/measure(开始测量,直到用户停止) PUT/measurepause=true/false(暂停/取消暂停) 删除/测量(停止) 获取/测量(获取测量数据) 但是,我不确定这是否适合REST模型,因为我在这里并不真正处理集合或元素
- POST/measure(开始测量,直到用户停止)
- PUT/measurepause=true/false(暂停/取消暂停)
- 删除/测量(停止)
- 获取/测量(获取测量数据)
我的问题:我如何访问单例资源,以及如何使对服务器的启动/停止请求打破RESTful无状态约束?您仍在处理资源,您打破资源的方式听起来不错。Fielding在以下内容中明确提到临时服务: REST中信息的关键抽象是资源。任何 可以命名的信息可以是资源:文档或图像, 临时服务(例如“洛杉矶今天的天气”)
也许给每个测量值一个唯一的id是有意义的。这样,您就可以唯一地引用每个度量值(您甚至不必存储旧度量值,但如果有人引用旧度量值,您可以告诉他们,他们请求的内容不再是最新的)。基于最后一个答案。下面是您可能希望将其分解的方式
- 测量值/-从仪器获取所有测量值(如果需要,根据查询参数进行分页/限制)
- measures/:measure_id-获取特定度量值
- measures/-POST-启动一个新的度量。这将返回新的度量值ID,您可以稍后处理它
- measures/:measure_id-DELETE-停止测量
- measures/:measure_id-PUT-更新度量值
- 测量值/最后测量值-最后测量的资源
获取
事实上,您的资源是一个单体,这一点都不是问题。问题在于你映射动词和状态的方式
你的描述有点抽象,所以让我们更具体一点:假设所讨论的仪器测量飞轮的角速度,单位为弧度/秒。此仪器有一些与测量相关的成本,因此客户需要能够在一段时间内禁用测量,以节省成本。如果这与您的场景大致类似,那么下面的说明应该适用于您的场景
动词
现在,让我们复习一下你的动词
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也可能反映您正在测量的内容(例如天气/洛杉矶)。但我想说的是你可以留着它