我需要一些澄清。我一直在阅读关于REST和构建基于REST的应用程序的书籍。根据维基百科,REST本身被定义为具象状态传输。因此,我不理解所有这些无国籍的官样文章,每个人都在不停地吐出来。
从维基百科:
在任何特定的时间,客户端可以处于之间的转换
应用程序处于“静止”状态。处于休息状态的客户端可以
与用户交互,但不创建负载,也不消耗每个客户端
服务器集或网络上的存储。
他们只是说不要使用会话/应用程序级数据存储吗?
我知道REST的一个目标是使URI访问一致且可用,例如,不是在帖子中隐藏分页请求,而是使请求的页码成为get URI的一部分。对我来说很有道理。但是,说每个客户端数据(会话数据)都不应该存储在服务器端似乎有点过头了。
如果我有一个消息队列,而我的用户想要读取消息,但在读取消息时,又想在会话期间阻止某些发送者的消息通过,该怎么办?将其存储在服务器端的某个位置,并让服务器只发送未被用户阻止的消息(或消息ID),这难道不合理吗?
每次请求新的消息列表时,我真的必须发送整个消息发送者列表来阻止吗?与我相关的消息列表在一开始就不应该是公开可用的资源。
我只是想理解一下。谁来澄清一下。
更新:
我发现了一个堆栈溢出的问题,它的答案并不能让我一直走到那里:
如何在REST中管理状态
这说明客户端状态很重要,应该在每个请求上都传输....Ugg . .看起来开销很大…这样对吗??
他们只是说不要使用会话/应用程序级数据存储吗?
不。他们不是在用一种无关紧要的方式说。
他们说不要定义“会话”。不登录。不注销。为请求提供凭据。每个请求都是独立的。
您仍然有数据存储。您仍然拥有身份验证和授权。您只是不需要浪费时间建立会话和维护会话状态。
关键在于,每个请求(a)都是完全独立的,(b)可以简单地外包给一个巨大的并行服务器群,而不需要任何实际工作。Apache或Squid可以盲目且成功地传递RESTful请求。
如果我有一个消息队列,而我的用户想要读取消息,但在读取消息时,又想在会话期间阻止某些发送者的消息通过,该怎么办?
如果用户需要一个过滤器,那么只需在每个请求上提供过滤器。
难道……不合理吗?服务器是否只发送未被用户阻止的消息(或消息ID) ?
是的。在RESTful URI请求中提供筛选器。
每次请求新的消息列表时,我真的必须发送整个消息发送者列表来阻止吗?
是的。这个“要阻止的消息发送者列表”可以有多大?一个简短的PK列表?
GET请求可以非常大。如果有必要,您可以尝试POST请求,尽管它听起来像一种查询。
最基本的解释是:
服务器上没有客户端会话状态。
无状态意味着服务器不在服务器端存储任何关于客户端会话的状态。
客户端会话存储在客户端上。服务器无状态意味着每个服务器可以在任何时间服务任何客户端,不存在会话关联或会话保持。相关的会话信息存储在客户机上,并根据需要传递给服务器。
这并不妨碍与web服务器通信的其他服务维护有关业务对象(如购物车)的状态,而不是有关客户端当前应用程序/会话状态的状态。
客户端的应用程序状态永远不应该存储在服务器上,而是从客户端传递到每个需要它的地方。
这就是REST中的ST(状态传输)的由来。您传递状态,而不是让服务器存储它。这是扩展到数百万并发用户的唯一方法。如果没有别的原因,只是因为数百万次会话就是数百万次会话。
会话管理的负载被分摊到所有客户机上,客户机存储它们的会话状态,服务器可以以无状态的方式为多个数量级或更多的客户机提供服务。
即使对于一个您认为只需要成千上万并发用户的服务,您仍然应该使您的服务无状态。几万还是几万,会有时间和空间成本。
无状态是HTTP协议和web一般设计的操作方式,是一个总体上更简单的实现,您有一个单一的代码路径,而不是一堆服务器端逻辑来维护一堆会话状态。
这里有一些非常基本的实现原则:
这些是原则而不是实现,你如何满足这些原则可能会有所不同。
总而言之,五个主要原则是:
给每件“东西”一个ID
把事物联系起来
使用标准方法
具有多个表示形式的资源
无状态通信
REST论文中没有任何关于身份验证或授权的内容。
因为验证RESTful请求与验证非RESTful请求并没有什么不同。身份验证与RESTful讨论无关。
解释如何为您的特定需求创建无状态应用程序,对于StackOverflow来说太宽泛了。
实现与REST相关的身份验证和授权甚至过于宽泛,一般在互联网上详细解释了各种实现方法。
寻求帮助/信息的评论将/应该被标记为
不再需要。
他们只是说不要使用会话/应用程序级数据存储吗?
不。他们不是在用一种无关紧要的方式说。
他们说不要定义“会话”。不登录。不注销。为请求提供凭据。每个请求都是独立的。
您仍然有数据存储。您仍然拥有身份验证和授权。您只是不需要浪费时间建立会话和维护会话状态。
关键在于,每个请求(a)都是完全独立的,(b)可以简单地外包给一个巨大的并行服务器群,而不需要任何实际工作。Apache或Squid可以盲目且成功地传递RESTful请求。
如果我有一个消息队列,而我的用户想要读取消息,但在读取消息时,又想在会话期间阻止某些发送者的消息通过,该怎么办?
如果用户需要一个过滤器,那么只需在每个请求上提供过滤器。
难道……不合理吗?服务器是否只发送未被用户阻止的消息(或消息ID) ?
是的。在RESTful URI请求中提供筛选器。
每次请求新的消息列表时,我真的必须发送整个消息发送者列表来阻止吗?
是的。这个“要阻止的消息发送者列表”可以有多大?一个简短的PK列表?
GET请求可以非常大。如果有必要,您可以尝试POST请求,尽管它听起来像一种查询。