题
我们正在重新开发在线购买功能,并以 RESTful 方式进行。
该过程分为三步,要求客户在每一步输入数据。
假设这三个 URL 是:
/step1.aspx
/step2.aspx
/step3.aspx
每个步骤都是相当自主的,不需要任何其他步骤的数据。
问题是,鉴于每个步骤对上一步一无所知,如何阻止客户直接导航到步骤 2,而无需先完成步骤 1 中的详细信息?
我知道我可以向我的对象模型添加一个属性,告诉我哪一步是最后一步等,但这不会破坏整个 REST 原则吗?
我也不想检查我的模型是否已填写上一步中的详细信息,因为这再次违反了 REST 原则。
我想我正在慢慢地接受这样一个观念:我需要(某些东西)来告诉我我去过哪里,但我不想要那样。
控制器是否应该/可以检测到历史记录不包含上一步,将控制放回我认为应该在的位置?
解决方案
REST的URL应该代表实体。例如书籍/命令/照片等
我觉得上面的困惑是,你要代表预订的序的在REST术语实体,和(当然),他们不是。让您的客户可以选择的对象,他们的订单等,可有效地以这种方式来表示。该方法的其它元件不应该。
您可能会认为,步骤1表示(为参数的缘故)的地址。但过帐地址对象是从在表单中输入的数据和从相关网页允许导航到/不同。该操作具有序列或流动到它,并在概念上比单纯投稿/歌厅更丰富/ delete一个的地址。你辩称要防止有人在完成第2步没有完成第1步等说明这一点。
其他提示
从step1.asx 到step2.asx 时,传递一个查询参数,其中包含一些键,告诉服务器step1 已被访问。例如,step1.asx 具有指向 step2.asx?whatever=a92jv29 的 href。
例如,“a92jv29”可以是来自服务器的加密时间戳。您可以轻松地在服务器端验证它是否有效(未过期且不是未来的)。无需存储状态。
您的 URL 可以有更好的名称,例如“terms.aspx”、“registration.aspx”或其他名称,但这完全没有必要。