我读过很多文章说会话违反了无状态性REST。
如果用户登录服务器,服务器会将会话cookie(ssid)提供给客户端,并将会话数据(用户数据)存储在服务器中,在本例中为内存。
它违反了无国籍状态,这是有道理的。
但是会话存储在数据库中怎么样?
如果用户登录服务器,服务器将会话cookie( ssid)提供给客户端,并将会话数据存储在mysql数据库中,而不是存储在内存中。
这是否也违反了无国籍状态?
如果是这样,“会话存储在数据库中”和“用户请求正在查询数据库数据”有什么区别?
当客户端发出请求时,它们都从数据库中提取一些数据。
显然,后者并不违反无状态性,否则REST建筑永远不会如此受欢迎。
我之前的问题,关于数据库的 RESTful 违规,回答者说“它没有违规”
反之亦然,会话真的违反了 RESTful 吗?回答者说“是的,这是违规的”。但该答案可能绑定到唯一的服务器端(内存)。
如此迷茫。
REST 中的无状态特指消息的自描述性。
这意味着每个请求必须包含服务器处理消息所需的所有信息。该请求不能引用先前的上下文请求。链接的文档(Fielding 的论文,REST 的起源)详细说明了为什么该限制对于分布式系统有用。
因此,最终无论某些内容是在数据库中还是在服务器的内存中,客户端都不能依赖先前建立的会话状态来进行后续请求。
可以这样想:客户端可能会将其下一个请求延迟几天,或者客户端可能会执行来自某种形式的书签的请求,或者该请求可能会发送到与所有先前请求不同的服务器。或者这可能是客户提出的第一个请求。这一切都应该以完全相同的方式工作。
另一个重要的一点是“会话状态”与存储在数据库中的与业务相关的事物(您似乎提到的)不同。当然,服务器可以在其数据库中存储与业务相关的内容,如果愿意的话,它甚至可以存储或缓存(在内存中)登录数据或会话状态,这都很好。然而,客户端和服务器可能不会做的是使用先前请求的上下文来“丰富”请求。
因此,客户端可能请求对某个数据库执行查询,该数据库显然具有某种“状态”。它可能不会做的是说:使用我之前提出的某些请求中指定的附加参数(例如登录)执行此查询。
在某些情况下,这条线可能会变得模糊,例如当服务器允许为客户端创建“事务”作为资源时。但是,当有疑问时,请始终知道为什么需要此属性以及您希望在特定架构中从它获得什么价值。
| 归档时间: |
|
| 查看次数: |
526 次 |
| 最近记录: |