我猜这个问题听起来很熟悉,但我还是一名被REST搞糊涂的程序员。
我的传统web应用程序从StateA到StateB等等。 如果用户访问(StateB的)URL,我希望确保他之前已经访问了StateA。 传统上,我使用会话状态(session state)来实现这一点。
由于在REST中不允许使用会话状态(session state),那么我该如何实现这一点呢?
我猜这个问题听起来很熟悉,但我还是一名被REST搞糊涂的程序员。
我的传统web应用程序从StateA到StateB等等。 如果用户访问(StateB的)URL,我希望确保他之前已经访问了StateA。 传统上,我使用会话状态(session state)来实现这一点。
由于在REST中不允许使用会话状态(session state),那么我该如何实现这一点呢?
这有两种REST答案,具体取决于你想要做什么。
如果你确实想要管理基于请求的状态(例如当用户正在通过多屏向导或其他基于导航的工作流程进行操作时),那么REST的答案是状态应该随每个请求/响应来回发送(使用类似于隐藏文本字段,查询字符串或存储在表单中的POST数据)。这是Martin Fowler的“客户端状态”设计模式的一种实现方式(在他的书《企业应用架构模式》中得到详细阐述;请参见此处获取参考资料)。
另一方面,如果你想管理服务器上的某种新对象,例如购物车,则REST的答案是你实际上正在创建一个新实体,可以像其他实体一样通过直接URL访问。无论你是否将此新实体存储在数据库中还是在应用程序内存中(如传统的Session对象)都取决于你,但是,无论哪种情况,新对象都不太涉及服务器上的“状态”,而更多地涉及为用户创建一个新实体以供交互。
1/2/3/submit
这样的URL。这似乎有点愚蠢,因为它正在重新创建会话状态,只是用URL。其中一个优点是,如果URL是永久链接,则会话不会超时。您可以将其加为书签以便稍后完成。 - 13ren