无状态

根据REST(REpresentational “State” Transfer)体系结构,服务器不会在服务器端存储有关客户端会话的任何状态。这种限制称为无状态。从客户端到服务器的每个请求都必须包含理解请求所需的所有信息,并且不能利用服务器上任何存储的上下文。因此,会话状态完全保留在客户端上。客户端负责在客户端存储和处理所有与应用程序状态相关的信息

它还意味着客户端负责在需要时将任何状态信息发送到服务器。服务器上不应存在​​任何_会话关联_或粘性会话

无状态意味着每个HTTP请求都完全隔离。当客户端发出HTTP请求时,它包含服务器完成该请求所需的所有信息。服务器永远不会依赖先前请求的信息。如果该信息很重要,客户端将在此请求中再次发送该信息。

为了使客户端能够访问这些无状态API,服务器还必须包括客户端可能需要创建状态的每条信息。

要成为无状态,请不要存储客户端的身份验证/授权详细信息。为请求提供凭据。每个请求必须独立,不应受到过去同一客户端之前发生的对话的影响。

应用状态与资源状态

请不要在应用程序状态和资源状态之间混淆。两者都完全不同。

应用程序状态是服务器端数据,服务器存储该数据以识别传入的客户端请求,其先前的交互细节和当前上下文信息。

资源状态是服务器上任何时间点资源的当前状态 - 它与客户端和服务器之间的交互无关。这是作为API响应从服务器获得的响应。您将其称为资源表示。

REST无状态意味着在应用程序状态下自由。

无状态的优点

使REST API无状态有一些非常显着的优点。

  1. 无状态通过将API部署到多个服务器,有助于将API扩展到数百万并发用户。任何服务器都可以处理任何请求,因为没有与会话相关的依赖。
  2. 无状态使得REST API不那么复杂 - 通过删除所有服务器端状态同步逻辑。
  3. 无状态API也很容易缓存。特定软件可以通过查看该一个请求来决定是否缓存HTTP请求的结果。从先前的请求中获得的状态可能会影响这个请求的可缓存性,这并不存在任何不确定性。它提高了应用程序的性能。
  4. 服务器永远不会忘记每个客户端在应用程序中的“位置”,因为客户端会在每个请求中发送所有必要的信息。

参考:罗伊T.菲尔丁对无状态