可以创建,修改小部件,然后提交小部件以供审阅.
要修改ID为123的窗口小部件,用户会对/ myapp / Widget / 123和新窗体数据执行PUT.服务器将所有表单数据重新打包为POJO,并将其交给逻辑层进行验证和后续持久性,调用WidgetManager.update(WidgetPojo).
要提交一个小部件供审阅,用户点击一个按钮,它也会对/ myapp / Widget / 123进行PUT,但现在表单数据只有一个字段,状态为“已提交”(我不发送全部表格数据再次,只是我要改变的字段).但是,现在服务器需要调用另一个业务对象WidgetStateManager.updateState(123,“submitted”),除了更新状态之外,还要进行其他一些专门的处理.
因此,为了尝试RESTful,我将小部件更新和提交审阅 *** 作建模为PUT到同一个URL / myapp / Widget / 123.所以现在,在我的服务器端代码中,我需要弄清楚特定PUT请求在业务功能方面意味着什么,以及因此要调用哪些业务功能.
但是,如何通过检查表单数据中的值来可靠地确定要调用的函数? SOOO很容易将“动作”字段与表单数据一起传递,并在PUT中使用“更新”或“提交以供审阅”等值!然后服务器可以根据该值进行切换.但那当然不是RESTful,只不过是装扮RPC.
仅通过在restlet中使用一堆if-then-elses检查表单数据来推断单击哪个按钮似乎不安全或可扩展.我可以想象可以在一个小部件上采取的许多不同的动作,因此有几十个if-then-elses.我在这里错过了什么?我的直觉告诉我,我没有正确建模我的资源,或者我错过了一个有用的特定资源抽象.
解决方法 几点;服务接口的域!=实现域
您的服务公开的资源不必直接实现为代码中的对象. (服务)接口不是实现.
放&帖子需要所有的外部状态
在进行更新时,您必须提供所有资源状态(您说您只提供更改 – 这是PATCH而不是PUT).
通过收集资源建模状态更改
有时最好将状态更改建模为集合资源.在您的示例中,您确实需要考虑具有关联的“审核队列”的“审核”资源,或者向窗口小部件添加“需要审核”属性.
方法1.“审查队列”的容器
拥有“审核”对象可以轻松列出小部件以供审核,分配资源以供审核等
GET / revIEw-queue – 列出需要审核的小部件
POST / revIEw-queue – 创建一个新的评论条目(仅列出ID,小部件的名称和返回小部件的URL)
DELETE / revIEw-queue / X – 在审核小部件时从队列中删除
如果存在与’revIEw-queue’相关的重要行为,我将使用此方法,例如与添加小部件以供审阅,多个审核队列等相关联的权限
方法2.’需要 – 审查’属性
您可以根据需要决定单独的资源是否过度杀死.您可以使用POST,PUT和GET建模基本功能.
创建窗口小部件时,它的状态包括s’require-revIEw’属性,该属性设置为False.显然你需要POST中的所有外部状态
当一个小部件需要审核时,请将其删除并将其与“需求 – 审核”更新一起放回去.同样,您需要PUT中的所有外部状态
列出小部件以供审阅时使用
GET / Widgets /?needs_revIEw = true
可怜的旧RPC
你在最后一段中提到了RPC,虽然它不是主题,但我不禁发表评论……
我想也许我们现在都因为责备RPC造成世界弊病而感到内疚. RPC的真正问题在于它旨在使远程函数调用对程序员透明,隐藏失败场景并尝试在实现语言中使用等效的远程调用作为标准函数调用.作为一个旧的CORBA(遭遇同样的问题)程序员,我可以理解REST如何纠正失败.
你发布的其他观点
如果不检查新状态并将其与现有状态进行比较,则无法确定要调用的方法.
您应该在执行任何其他 *** 作之前验证新状态,将任何错误传递回提交者.
从你的最后一段开始,我想你已经知道了 – 对不起.
克里斯
总结以上是内存溢出为你收集整理的web-applications – 按钮按下的RESTful建模,用于调用服务器端 *** 作到资源全部内容,希望文章能够帮你解决web-applications – 按钮按下的RESTful建模,用于调用服务器端 *** 作到资源所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)