如何区分应用程序状态和资源状态

Jas*_*key 4 architecture rest state web-applications stateless

我知道要创建无状态应用程序,我们需要来回传输用户状态而不是服务器保持用户状态.

但是,必须有一些状态存储在服务器中,我读到这篇文章,存储在服务器中的状态称为资源状态.所以,如果我是对的,我们经常调用的客户端状态应该与应用程序状态相同.

那么,我如何区分这两者,因为它将确定它们是应该存储在服务器中还是传输的.

以购物车为例.

  1. 如果在用户完成购买之前有5个步骤,则用户的阶段(#3,#4)似乎是应用程序状态,但这是否意味着如果他们关闭浏览器并再次点击付费,他将不得不从step1开始?

  2. 他图表中的项目怎么样?如果我们将其视为应用程序状态,我们需要将所有项目放在请求中.但是如果我们这样做,当用户关闭浏览器并再次登录时,他将无法再次找到他的项目,因为浏览器无法记住所有项目.因此,我们似乎应该将其视为资源状态.但如果是这样,当用户点击付费时,他们会有一个不同的页面:根据他的购物车是否为空,去支付或说"你的购物车是空的".因此,具有完全相同的param输入的相同请求出现了不同的结果,我们仍然可以说它是无状态的吗?

也许我明白了什么不对,请问任何人可以回答如何区分不同类型的状态以及如何区别对待它们?

ial*_*eev 6

资源状态是一种状态,即使在客户端断开连接/重新启动/会话结束/之后也需要持久且可存活. 应用程序状态应该存在于客户端上,并且应该提供每个客户端请求(如果我们正在讨论REST体系结构并计划很好地扩展我们的应用程序).

如何区分应用程序状态和资源状态?

这取决于您正在进行的任务.例如,如果您正在尝试找出保存库中当前查看的图片索引的位置,可能是您可以在应用程序状态下执行此操作,因为您可能不需要此状态才能在下一个状态中生存这个客户的会话.当然,您可以将它保存在您的资源状态(数据库)中,但这将是开销(为非常小的收益付出很多努力).

但是,如果您正在处理多步骤购买过程,可能最好将此过程的状态保存在资源状态(数据库)中,因为您希望永久保存此状态.否则,您的客户需要在断开/重启/等等之后重新填充大量信息.当然,您可以在cookie中执行此操作(并且它将是应用程序状态),并且此状态可以在浏览器重新启动后生效.但它有两个缺点:1)此状态在其他用户的设备上不可用,2)如果您正在创建真正的REST服务,cookie会使客户的生活变得复杂,因为并非所有客户端都能很好地运行cookie(浏览器除外).