“状态转移”在表述性状态转移(REST)中是指什么?

21

在Representational State Transfer中,“State Transfer”是什么意思?

虽然有些解释(例如这里)对此有所说明,但我还是不太理解。例如,在文章中说:

表现将客户端应用程序置于一种状态中。

为什么?“State”(我理解的是类似于会话的东西)与资源的表现形式有什么关系?


请在链接https://dev59.com/SGkv5IYBdhLWcg3wsC3i#37659395中查看此回答。 - Ciro Corvino
也可以尝试在此链接中找到答案:https://dev59.com/W5fga4cB1Zd3GeqPBM1B#37683965 - Ciro Corvino
2个回答

21
为什么?状态(我理解为类似于会话的东西)与资源表示有什么关系?
一个对象具有属性(或状态)和行为(或方法)。
如果我想要将一个对象从我的桌面移动到服务器上,我必须执行以下操作:
1. 创建对象状态的表示。 2. 将该表示从桌面传输到服务器。 方法不需要传输。我在两台机器上都安装了相同的类定义。
因此,REST旨在创建对象当前状态的表示,以便可以将其从另一台服务器传输,从中可以重构对象。
我们只发送对象的状态 - 属性。我们必须创建外部序列化表示该状态的表示。

3
尽管听起来相似,状态转移与对象序列化并不完全相同。 - Darrel Miller
@user2011:“行为怎么办?”REST不涉及行为。它是“状态转移”。对象的当前状态是所表示的内容。行为是在每个端点进行适当配置控制的问题。 - S.Lott
4
状态转移更多地涉及从状态机中的一个状态过渡到另一个状态。REST中的“状态转移”完全是关于行为,与通过网络传输对象无关。 - Darrel Miller
@S.Lott REST超媒体约束,又称作超媒体作为应用状态的引擎,特别是指客户端的状态。你看过我对这个问题的回答了吗? - Darrel Miller
1
  1. 因此,REST是为了避免保存状态,而是每次客户端与服务器通信时传输状态?
  2. 这是否意味着我必须将状态存储到客户端并将其放入请求中,以便服务器可以获取并传输另一个状态?
  3. 如果我将状态存储在数据库或内存缓存中呢?这算是一种REST吗?
- JaskeyLam
显示剩余8条评论

13

考虑一个客户端应用程序是一种巨大的状态机。客户端的初始状态等于从服务器返回的第一个表示。返回表示中的链接提供了可能的“状态转换”。

需要注意的一件事是,有两种主要类型的链接,被动链接和主动链接。像<img><link rel="stylesheet">这样的被动链接实际上不会导致状态转换,它们只是增强当前状态。而<form><a>等链接则是主动链接,它们引起状态转换。在跟随其中一个链接后,新的客户端状态等于返回的表示,也就是状态转移

如果您习惯构建传统的桌面客户端应用程序,您会发现这是一种完全不同的架构。这不是您可能一夜之间能够理解的。最初,这种方法可能看起来非常限制,但是当您考虑到客户端应用程序可以是许多同时执行的状态机的托管程序时,您将开始意识到,您可以做的几乎与使用远程对象架构相同,并仍然保持Web浏览器的松散耦合。


1
转移和过渡是一样的吗?我可以认为ST(transfer)表示我们每次传输客户端状态,而不是将其存储到本地机器中吗? - JaskeyLam
1
@Jaskey 过渡是进行传输的效果。您可能正在将客户端状态转移到服务器,和/或从服务器向客户端传输资源状态。 - Darrel Miller
所以,另一个问题是,如果我使用memcache或db来存储用户状态,比如“已登录”,那这绝对不是REST应用程序了吗?我看到很多帖子或视频说我们必须让客户端负责自己的状态,并且服务器上不会存储任何状态。但很多帖子都指出为了创建无状态应用程序,我们可以使用db或memcache来存储状态,这使我感到困惑,所以我在http://stackoverflow.com/questions/27016314/does-ststate-transfer-in-rest-mean-that-state-must-be-held-by-client上提出了这个问题,如果您能花一分钟回答那里,我将不胜感激!谢谢! - JaskeyLam

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接