REST 的无状态原则究竟意味着啥?

Posted

技术标签:

【中文标题】REST 的无状态原则究竟意味着啥?【英文标题】:What does REST's principle of statelessness actually means?REST 的无状态原则究竟意味着什么? 【发布时间】:2012-10-23 19:10:45 【问题描述】:

阅读有关 REST(Fielding's thesis 和其他)的介绍性文章后,我对无状态的看法是服务器端不应该有会话对象。然而,我看到Flask(可能还有其他我不知道的不同技术的 REST 框架)为我们提供了一个会话对象,用于在这个example 中存储服务器上的信息:

@app.route('/login', methods=['GET', 'POST'])
def login():
  if request.method == 'POST':
    session['username'] = request.form['username']
    return redirect(url_for('index'))
...

当然,我误解了 REST 的无状态性。那么,它到底是什么?

【问题讨论】:

这是个好问题。我不知道答案,但实用主义总是胜过教条主义这可能是一句古老的格言:-)尽管你很快就会得到一个更有根据的答案。 是的,我能感觉到有人在输入答案并出于多种目的很好地把它写下来。 相关:***.com/questions/3105296/… 【参考方案1】:

在 REST 中引入无状态约束的目的包括提高可见性、可靠性和可扩展性。这意味着代理和其他中介能够更好地参与涉及自描述无状态消息的通信模式,服务器死亡和故障转移不会导致会话状态同步问题,并且很容易添加新服务器以再次处理客户端负载,而无需需要同步会话状态。

REST 通过多种机制实现无状态:

    通过设计方法和通信模式,它们不需要在请求后将状态保留在服务器端。 通过设计公开功能的服务,以直接采样和转换服务器端状态,而没有剩余的应用程序状态 每当需要会话状态或应用程序状态时,通过“延迟”或在每个请求结束时将状态作为消息传递回客户端

最后一点暴露了无状态的缺点:需要某种会话状态的应用程序在单个请求的持续时间之外仍然存在,需要将该状态作为响应消息的一部分发送回客户端。下次客户端要发出请求时,状态会再次传递给服务,然后再返回客户端。

您可以从这里获得更多信息http://soundadvice.id.au/blog/2009/06/

【讨论】:

我认为您应该对您复制并粘贴答案的博客作者给予应有的评价,方法是在您的答案中添加链接:soundadvice.id.au/blog/2009/06【参考方案2】:

不,你理解得很好。 RESTful 服务中不应该有任何“会话”。始终检查您是否可以通过邮件发送任何 URI,将其保存在书签中,并在链接中引用它。这确实是 REST 对 Web 如此重要的原因:没有 RESTful 资源 = 没有更多链接。只能在访问资源表示时进行身份验证。

您可以拥有一个可以通过 REST 方法修改的用户对象(例如购物车),而不是会话。这与会话不同,因为例如,您可以在某些服务中授权其他人查看您的购物车。

【讨论】:

【参考方案3】:

在 REST 架构中,会话状态完全保存在客户端上。这意味着数据不能在共享上下文中留在服务器上,我们仍然必须在一系列请求中发送重复数据(每次交互开销)。 当我们在客户端保持应用程序状态时,这减少了服务器对一致应用程序行为的控制,因为应用程序变得依赖于跨多个客户端版本的语义的正确实现。 然而,这种约束导致了可见性、可靠性和可扩展性的属性。

提高了可见性,因为监控系统不必 超越单个请求数据以确定完整的请求数据 请求的性质。 提高了可靠性,因为它简化了从 部分失败。 提高了可伸缩性,因为不必在之间存储状态 requests 允许服务器组件快速释放资源,并且 进一步简化了实现,因为服务器不必 跨请求管理资源使用情况。

见http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm

【讨论】:

以上是关于REST 的无状态原则究竟意味着啥?的主要内容,如果未能解决你的问题,请参考以下文章

Java中的无状态函数

SOA 的无状态 ORM

JWT 令牌中的无状态身份验证和权限

怎样用通俗的语言解释啥叫 REST,以及啥是 RESTful

怎样用通俗的语言解释啥叫 REST,以及啥是 RESTful

REST - 复杂的应用程序