在阅读有关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的无国籍状态。那么,它真的是什么?
答案 0 :(得分:5)
在REST中引入无状态约束的目的包括提高可见性,可靠性和可伸缩性。这意味着代理和其他中介能够更好地参与涉及自描述无状态消息的通信模式,服务器死亡和故障转移不会导致会话状态同步问题,并且很容易添加新服务器以再次处理客户端负载需要同步会话状态。
REST通过多种机制实现无状态:
无国籍状态的缺点暴露在最后一点:需要某种会话状态的应用程序持续超过单个请求的持续时间需要将该状态作为响应消息的一部分发送回客户端。下次客户端想要发出请求时,状态将再次转移到服务,然后再转移回客户端。
获取更多信息答案 1 :(得分:1)
不,你理解得很好。 RESTful服务中不应该有任何“会话”。始终检查您是否可以通过邮件发送任何URI,将其保存在书签中,并在链接中引用它。这确实是REST对Web如此重要的原因:没有RESTful资源=没有更多的链接。只有在访问资源表示时才能进行身份验证。
您可以拥有的而不是会话的是可以通过REST方法修改的用户对象(例如购物车)。这与会话不同,因为,例如,可能有服务可以授权其他人查看您的购物车。
答案 2 :(得分:1)
在REST架构中,会话状态完全保留在客户端上。这意味着数据不能在共享上下文中保留在服务器上,我们仍然必须在一系列请求中发送重复数据(每个交互开销)。 当我们在客户端保持应用程序状态时,这会降低服务器对一致应用程序行为的控制,因为应用程序依赖于跨多个客户端版本的语义的正确实现。 但是,这种约束会导致可见性,可靠性和可伸缩性。
请参阅http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm