我想这个问题听起来很熟悉,但我还是另一个被REST困惑的程序员。
我有一个传统的Web应用程序,从StateA到StateB等等。 如果用户访问StateB的(URL),我想确保他之前访问过StateA。 传统上,我使用会话状态来执行此操作。
由于REST中不允许会话状态,我该如何实现?
答案 0 :(得分:50)
这有两个REST答案,具体取决于您的具体操作。
如果您真的想要管理基于请求的状态(例如当用户正在使用多屏幕向导或其他一些基于导航的工作流程时),那么REST答案就是该状态应该被发回 - 并且 - 与每个请求/响应(使用类似隐藏文本字段,查询字符串或存储在表单中的POST数据)。这是Martin Fowler的“客户状态”设计模式的实现(在他的书中详细描述了企业应用程序架构模式;请参阅here for a reference)。
另一方面,如果您尝试在服务器上管理某种新对象(例如购物车),那么REST的答案是您实际上正在创建一个可以像任何其他直接URL。是否将此新实体存储在数据库或应用程序内存中(如传统的Session对象)取决于您,但无论如何,新对象不是关于服务器上的“状态”,而是关于创建新实体的更多信息。用户与之交互的实体。