我们正在重新开发我们的buyonline功能,我们正在以RESTful方式进行。
该过程分为三步,要求客户在每一步输入数据。
假设这三个网址是;
/step1.aspx
/step2.aspx
/step3.aspx
每个步骤都非常自主,不需要任何其他步骤的数据。
问题是我如何阻止客户直接导航到第2步,首先完成步骤1中的详细信息,因为每一步都不知道上一步?
我知道我可以在我的对象模型中添加一个属性,告诉我哪个步骤是最后一个等但是这不是有点打破整个REST原则吗?
我也不想检查我的模型,以确定上一步中的细节是否已经存档,因为这又违反了REST原则。
我想我正在慢慢地辞去一个我需要(某事)的概念,告诉我我去过哪里,但我不希望这样。
控制器应该/可以检测到历史记录不包含上一步将控制权放回到我认为的位置吗?
答案 0 :(得分:3)
REST URL应该代表实体。例如书籍/订单/照片等。
我认为上面的混淆是你试图用REST术语表示预订序列作为实体,而且(当然)它们不是。因此,客户可以选择的对象,订单等可以以这种方式有用地表示。该过程的其他要素不应该是。
你可能会争辩说第1步代表一个地址(为了争论)。但POST一个地址对象不同于在表单中输入该数据并允许导航到相关页面或从相关页面导航。该操作具有序列或流程,并且在概念上比简单地POSTing / GETing / DELETEing地址更丰富。你已经通过争论你想要阻止某人完成第2步而不完成第1步等来说明这一点。
答案 1 :(得分:2)
从step1.asx转到step2.asx时,传递一个查询参数,该参数包含一些告诉服务器访问过step1的键。例如,step1.asx有一个href到step2.asx?whatever = a92jv29。
“a92jv29”可以是,例如,来自服务器的加密时间戳。您可以轻松验证服务器端是否有效(未过期而不是将来)。无需存储州。
您的网址可能有更好的名称,应该是“terms.aspx”,“registration.aspx”或其他什么,但严格来说不是必需的。