Web applications 对调用资源的服务器端操作的按钮按下的RESTful建模

Web applications 对调用资源的服务器端操作的按钮按下的RESTful建模,web-applications,rest,Web Applications,Rest,我正在开发一个新的web应用程序,我们希望它能以RESTful方式运行。现在是开始设计交互的时候了,REST的一些基本问题让我感到困惑。我正试图找出最好的方法来调解REST和OO之间的阻抗不匹配,而不会滑向RPC的滑坡。让我举一个(人为的)例子 可以创建、修改小部件,然后提交审查 要修改id为123的小部件,用户需要输入/myapp/widget/123和新表单数据。服务器将所有表单数据重新打包为POJO,并调用WidgetManager.update(widgetPojo)将其交给逻辑层进行验

我正在开发一个新的web应用程序,我们希望它能以RESTful方式运行。现在是开始设计交互的时候了,REST的一些基本问题让我感到困惑。我正试图找出最好的方法来调解REST和OO之间的阻抗不匹配,而不会滑向RPC的滑坡。让我举一个(人为的)例子

可以创建、修改小部件,然后提交审查

要修改id为123的小部件,用户需要输入/myapp/widget/123和新表单数据。服务器将所有表单数据重新打包为POJO,并调用WidgetManager.update(widgetPojo)将其交给逻辑层进行验证和后续持久化

要提交一个小部件以供查看,用户单击一个按钮,该按钮也会输入/myapp/widget/123,但现在表单数据只有一个字段,状态为“已提交”(我不再发送所有表单数据,只发送我要更改的字段)。但是,现在服务器需要调用另一个业务对象WidgetStateManager.updateState(123,“submitted”),该对象除了更新状态外,还将执行其他一些专门的处理

因此,为了实现RESTful,我将widget更新和submit for review操作建模为放在同一URL/myapp/widget/123上。所以,现在,在我的服务器端代码中,我需要弄清楚一个特定的PUT请求在业务函数方面意味着什么,因此需要调用哪些业务函数

但是,仅仅通过检查表单数据中的值,如何可靠地确定要调用哪个函数呢?在表单数据中传递一个“action”字段是非常诱人的,在PUT中有“update”或“submitforreview”这样的值!然后服务器可以根据该值进行切换。但这当然不是休息,只不过是精心打扮的RPC

仅仅通过在restlet中使用一组if-then-else检查表单数据来推断单击了什么按钮似乎不安全,也不可伸缩。我可以想象在一个小部件上可以执行几十种不同的操作,因此会有几十种if-then-else。我错过了什么?我的直觉告诉我,我没有正确地建模我的资源,或者我缺少了一个可以帮助我的特定资源抽象;

服务接口的域!=实现域 服务公开的资源不必在代码中直接实现为对象。(服务)接口不是实现


Put&Post需要所有外部状态 在进行更新时,您必须提供所有资源状态(您说过您只提供更改-这是一个补丁而不是PUT)


通过集合资源对状态更改进行建模 有时,最好将状态更改建模为集合资源。在你的例子中,你确实需要考虑一个“回顾”资源和一个相关的“审查队列”,或者将一个“需要审查”属性添加到小部件。p> 方法1。“审阅队列”的容器

拥有“Review”对象可以方便地列出要查看的小部件,分配要查看的资源等

获取/查看队列——列出需要查看的小部件

POST/review队列——创建一个新的审查条目(只列出小部件的id、名称和返回小部件的url)

DELETE/review queue/X——在查看小部件时从队列中删除

如果存在与“审查队列”相关的重大行为,例如与添加用于审查的小部件相关的权限、多个审查队列等,我会使用这种方法

方法2。”“需要审查”属性

您可能会认为,为满足您的需求,一个单独的资源是多余的。您可以使用POST、PUT和GET对基本功能进行建模

当一个小部件被创建时,它的状态包括一个设置为False的“需要审查”属性。显然,您需要在POST中使用所有外部状态

当一个小部件需要审查时,获取它并将其放回更新的“需要审查”。同样,您需要PUT中的所有外部状态

列出小部件以供查看时使用

GET/widgets/?需要\u review=true


可怜的老家伙 你在最后一段提到RPC,虽然它离题了,但我还是忍不住要评论

我想也许我们现在都有罪,因为我们把世界的弊病归咎于RPC。RPC的真正问题在于,它旨在使远程函数调用对程序员透明,隐藏失败场景,并试图使远程调用在实现语言中等效为标准函数调用。作为一个老的CORBA(也有同样的问题)程序员,我能够理解REST是如何纠正这个错误的


你的帖子中的其他观点

如果不检查新状态并将其与现有状态进行比较,则无法确定要调用哪个方法

您应该在执行任何其他操作之前验证新状态,将任何错误传递回提交者

从你的最后一段,我想你已经知道了-对不起


Chris

您不局限于将URL映射到域对象。RESTful API有少量的操作,但有大量的资源可以应用这些操作

创建小部件:

POST to/rest/widget(返回“123”)

(“POST方法用于请求源服务器接受包含在请求中的实体,作为请求行中请求URI标识的资源的新下级。”)

验证小部件123:

发送至/restapi/validator/123

(资源是widget 123的概念上的“验证器”。)

更新小部件123:

放入/restapi/widget/123

提交小部件123以供审查:

发布到/restapi/reviewqueue

(只有