我有一个向导格式的网页。API的提交按钮将位于向导的第4步。但是,我希望输入的数据先存储在数据库中,然后再进行向导的下一步。我还希望REST API适用于具有单个选项卡的页面。
因此,我设计了API以采用查询参数action =草稿或提交。如果采取行动,则仅某些字段是必填字段。如果提交了操作,则所有字段均为必填。REST API服务层中的验证将基于查询参数完成。看来我必须在文档中明确指定if / else子句。这是RESTful设计的可接受形式吗?满足这些要求的最佳设计是什么?
我有一个向导格式的网页。API的提交按钮将位于向导的第4步。但是,我希望输入的数据先存储在数据库中,然后再进行向导的下一步。我还希望REST API适用于具有单个选项卡的页面。
因此,我设计了API以采用查询参数action =草稿或提交。如果采取行动,则仅某些字段是必填字段。如果提交了操作,则所有字段均为必填。REST API服务层中的验证将基于查询参数完成。看来我必须在文档中明确指定if / else子句。这是RESTful设计的可接受形式吗?满足这些要求的最佳设计是什么?
Answers:
由于您希望在向导步骤之间将事物保留在服务器上,因此将每个步骤视为一个单独的资源似乎是完全可以接受的。遵循以下原则:
POST /wizard/123/step1
POST /wizard/123/step2
POST /wizard/123/step3
通过在响应中包括超媒体链接,您可以告知客户端此步骤后可以执行的操作-前进或后退以执行中间步骤,最后一步则什么也不做。你可以看到在图5中它的一个例子在这里。
in_progress
或设置布尔值即可draft
。
前段时间我需要做类似的事情,以下内容描述了最终的结果。
我们有两个表,Item和UnfinishedItem。当用户使用向导填写数据时,数据将存储在UnfinishedItem表中。在每个向导步骤中,服务器都会验证在该步骤中输入的数据。当用户完成向导后,向导将在确认页面中呈现隐藏/只读表单,该页面显示所有要提交的数据。用户可以查看此页面并返回到相关步骤以更正错误。一旦用户对他们的输入感到满意,用户将单击提交,然后向导会将隐藏/只读表单字段中的所有数据提交给API服务器。当API服务器处理此请求时,它将重新运行它在向导的每个步骤中所做的所有验证,并执行不适合各个步骤的其他验证(例如,全局验证,昂贵的验证)。
两表方法的优点:
在数据库中,与未完成项目表相比,对项目表的约束可能更严格;您不必具有向导完成后实际上将需要的可选列。
由于您不必记住将UnfinishedItems排除在外,因此汇总报表中的汇总查询更加容易。在我们的例子中,我们不需要在Item和UnfinishedItems之间进行聚合查询,因此这不是问题。
缺点:
我考虑过的其他可能性以及为什么我们不选择它们:
if
在整个验证过程中使用一堆语句检查草稿状态,这是不好的。如果正确实施,某些非常复杂的框架(如Ruby on Rails)可以大大简化该问题。
我以类似于@ guillauma31和@Lie Ryan的解决方案的混合方式实现了这一点。
以下是关键概念:
/users/:id_user/profile/step_1
,.../step_2
等).../profile/confirm
。该资源不需要再次接收所有数据。它仅将数据标记为正确和完整。前端人员必须照顾令牌,以使向导来回工作。
该API是无状态且原子的。
要使“一步向导”与此设置配合使用,您必须进行一些更改,例如删除令牌流或创建基于向导类型返回令牌的资源,甚至创建新资源仅用于填充此特定单步骤向导(如PUT /users/:id_user/profile/
)。