REST的无国籍原则实际上意味着什么?

时间:2012-11-03 07:01:42

标签: python rest flask stateless

在阅读有关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的无国籍状态。那么,它真的是什么?

3 个答案:

答案 0 :(得分:5)

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

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

  1. 通过设计方法和通信模式,他们不需要在请求后保留服务器端的状态。
  2. 通过设计公开能够直接采样和转换服务器端状态而没有剩余应用程序状态的服务
  3. 每当需要会话状态或应用程序状态时,通过“延迟”或将状态作为消息传递给客户端
  4. 无国籍状态的缺点暴露在最后一点:需要某种会话状态的应用程序持续超过单个请求的持续时间需要将该状态作为响应消息的一部分发送回客户端。下次客户端想要发出请求时,状态将再次转移到服务,然后再转移回客户端。

    您可以从http://soundadvice.id.au/blog/2009/06/

    获取更多信息

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

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

  • 可见性得到改善,因为监控系统不需要 超越单个请求数据以确定完整 请求的性质。
  • 可靠性得到改善,因为它简化了从中恢复的任务 部分失败。
  • 可扩展性得到改善,因为无需在两者之间存储状态 请求允许服务器组件快速释放资源,以及 进一步简化了实现,因为服务器不必 管理跨请求的资源使用情况。

请参阅http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm