REST的无状态原则实际上是什么意思?

20
阅读了有关REST(Fielding的论文和其他文章)的介绍性文章后,我对无状态的理解是服务器端不应该有会话对象。然而,我发现Flask(以及可能是其他我不知道的不同技术的REST框架)在这个example中提供了一个会话对象来存储服务器上的信息。请注意保留HTML标签。
@app.route('/login', methods=['GET', 'POST'])
def login():
  if request.method == 'POST':
    session['username'] = request.form['username']
    return redirect(url_for('index'))
...

当然,我对REST的无状态性理解有误。那么,它真正是什么?

6
这是一个好问题。我不知道答案,但可能是因为实用主义始终战胜教条主义的古老格言 :-) 虽然您很快就会得到更有见识的答案。 - paxdiablo
是的,我能感觉到有人正在输入答案,并将其整理得很好,目的多样。 - badmaash
2
相关链接:https://dev59.com/g3A75IYBdhLWcg3wy8Qi - Ray Toal
3个回答

5
引入REST中的无状态约束的目的是为了改善可见性、可靠性和可伸缩性。这意味着代理和其他中介能够更好地参与涉及自描述无状态消息的通信模式,服务器死亡和故障转移不会导致会话状态同步问题,并且很容易添加新服务器以处理客户端负载,而无需同步会话状态。
REST通过一些机制实现无状态:
1.通过设计方法和通信模式,它们不需要在请求之后保留服务器端状态。
2.通过设计服务,公开直接采样和转换服务器端状态的功能,而不留下应用程序状态。
3.在每个请求结束时,如果需要会话状态或应用程序状态,则将状态“推迟”或作为消息传递回客户端。
无状态的缺点在于最后一点:要求某种会话状态持续超过单个请求的应用程序需要将该状态作为响应消息发送回客户端。下次客户端想要发出请求时,状态再次传输到服务并返回到客户端。

你可以从这里http://soundadvice.id.au/blog/2009/06/获取更多相关信息。


6
我认为你应该给予博客作者应有的荣誉,因为你是通过复制和粘贴的方式得到了答案,所以在你的回答中加入链接:http://soundadvice.id.au/blog/2009/06/ - badmaash

1
不,你理解得很好。在RESTful服务中不应该有任何“会话”。始终要检查您是否可以通过电子邮件发送任何URI,将其保存在书签中并在链接中引用它。这确实是为什么REST对Web如此重要的原因:没有RESTful资源=没有更多链接。只有在访问资源表示时才应进行身份验证。
您可以使用REST方法修改的是用户对象(例如购物车),而不是会话。这与会话不同,因为例如可能存在服务,您可以授权其他人查看您的购物车。

1
在REST架构中,会话状态完全保存在客户端上。这意味着数据不能留在服务器的共享上下文中,我们仍然需要通过一系列请求发送重复的数据(每次交互的开销)。由于我们将应用程序状态保留在客户端上,因此减少了服务器对一致应用程序行为的控制,因为应用程序依赖于多个客户端版本之间正确实现语义的正确性。
但是,这种约束引发了可见性、可靠性和可扩展性的属性。
- 可见性得到改善,因为监视系统不必查看单个请求数据以确定请求的全部性质。 - 可靠性得到改善,因为它简化了从部分故障中恢复的任务。 - 可扩展性得到改善,因为不必在请求之间存储状态允许服务器组件快速释放资源,并进一步简化了实现,因为服务器不必跨请求管理资源使用情况。
参见http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm

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