每当我读到REST架构时,总会有一个关于无状态操作的消息。从我的基本理解来看,Ruby on Rails应该是REST架构。 根据我的理解,无状态操作意味着连续的请求彼此独立。 但是在Ruby on Rails中,我们确实有会话变量和cookie,它们可以跟踪从一个请求到另一个请求的一些数据。 这无视无国籍行动吗? 我很迷惑。 有人可以澄清一下吗?
答案 0 :(得分:3)
但是在Ruby on Rails中,我们确实有会话变量和cookie,可以跟踪从一个请求到另一个请求的一些数据。这无视无国籍行动吗?
不,请求仍然是#34;无状态" (使用基于cookie的会话存储),因为cookie随每个请求一起发送(而不是在服务器上跟踪)。因此,每个请求都包含其处理所需的所有信息,使其独立于之前的所有请求。
答案 1 :(得分:0)
Ruby on Rails遵循务实的现实世界方法 - 而不是原教旨主义坚持原则。 REST的核心可能是无状态的,但是为浏览器创建完全无状态的应用程序并不是很理想。
Rails主要采用资源标识符的思想,使用HTTP谓词在其路由约定中表示REST中的不同操作。如何使用它来构建应用程序取决于程序员。
# An example of Rails "RESTful" routes:
Prefix Verb URI Pattern Controller#Action
things GET /things(.:format) things#index
POST /things(.:format) things#create
new_thing GET /things/new(.:format) things#new
edit_thing GET /things/:id/edit(.:format) things#edit
thing GET /things/:id(.:format) things#show
PATCH /things/:id(.:format) things#update
PUT /things/:id(.:format) things#update
DELETE /things/:id(.:format) things#destroy
使用基于令牌的身份验证的API应用程序可以被视为无状态,例如,因为客户端凭据在每个请求的HTTP标头中传递。
对于不可行的传统Web应用程序,因为浏览器不提供与请求一起发送凭据的任何有用选项。您可以构建一个完全无状态的应用程序 - 但不需要任何类型的身份验证,而无需用户登录每个请求。
Cookie确实随每个请求一起发送 - 并且很长一段时间浏览器可以保留状态的唯一方式,除了通过URL来回传递它:s。
然而,Rails使用cookie进行会话存储的方式比赋予其无状态性更为明显。解码加密的cookie比任何其他存储机制都快。
会议的整个想法本质上是有状态的。您正在添加请求URL,参数和标题之外的状态存储,这就是基于会话的授权被视为有状态的原因。