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

在阅读关于REST(Fielding的论文和其他)的介绍性文章之后,我对无状态的理解是服务器端不应该有会话对象。 然而,在这个例子中,我看到了Flask(也许还有其他我不知道的技术中的REST框架)为我们提供了一个会话对象来存储服务器上的信息:

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

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


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

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

  • 通过设计方法和通信模式,在请求之后,他们不需要将状态保留在服务器端。
  • 通过设计暴露功能的服务来直接对服务器端状态进行采样和转换,而无需遗留应用程序状态
  • 每当请求会话状态或应用程序状态时,通过在每个请求结束时将“推迟”或将状态传递回客户端作为消息
  • 无状态的缺点暴露在最后一点:需要某种会话状态的应用程序持续超出单个请求的持续时间时,需要将该状态作为响应消息的一部分发送回客户端。 下次客户想要发出请求时,状态会再次转移到服务中,然后返回给客户端。

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


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

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


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

  • 可见性得到改进,因为监控系统不必超越单个请求数据,以确定请求的全部性质。
  • 可靠性得到改善,因为它减轻了部分故障恢复的任务。
  • 可伸缩性得到了改善,因为不需要在请求之间存储状态,服务器组件可以快速释放资源,并且进一步简化了实现,因为服务器无需管理跨请求的资源使用情况。
  • 见http://www.ics.uci.edu/~fielding/pubs/dissertation/rest_arch_style.htm

    链接地址: http://www.djcxy.com/p/41141.html

    上一篇: What does REST's principle of statelessness actually means?

    下一篇: How to design a RESTful API to check for user's credentials?