几天前有人问我这个问题我没有答案:
由于HTTP是无状态协议。当我们打开www.google.com时,可以 被称为REST呼叫?
我的想法:
当我们在google.com上进行搜索时,所有信息都会通过Cookie和网址参数传递。它看起来像一个无国籍的请求。 但搜索结果并不独立于用户的过去请求。搜索结果特定于用户兴趣和行为。现在,它看起来不像无状态请求。
我知道这是一个老问题,我已经阅读了许多SO答案,例如Why HTTP is a stateless protocol?,但我仍然无法理解在谷歌或亚马逊上跟踪用户活动时会发生什么(基于过去购买的建议)或任何其他基于用户活动的推荐网站。
它是RESTful还是RESTless?
如果我想创建一个使用REST架构但仍提供特定于用户的响应的Web应用程序,该怎么办?
答案 0 :(得分:7)
HTTP是无状态的,但Google应用层不是。特定Cookie及其含义是应用层的一部分。
考虑与TCP / IP相同。 IP是无状态协议,但TCP不是。嵌入在IP数据包中的TCP状态的存在并不意味着IP协议本身具有状态。
那么这会使它成为REST呼叫吗?没有。
虽然HTTP是无状态的&我怀疑www.google.com在请求禁用cookie时,每个请求的结果都是相同的,使其几乎无状态(谷歌仍可能跟踪IP以限制请求频率)。
但是应用层不是无状态的。 REST的原则之一是系统不会在请求之间保留有关客户端的状态数据,以便修改响应。就Google而言,显然没有发生这种情况。
答案 1 :(得分:4)
似乎“无国籍”的含义(假设地)超越了它的实际表达。
考虑一个完全没有数据库的网络系统。您调用(RESTful)API,您始终可以获得完全相同的结果。这是完全无国籍的......但这完全不是一个真正的系统。
在几乎每个实现中,真实系统都保存数据。此外,该数据是RESTful API允许我们访问的“资源”。当然,由于API调用,数据也会发生变化。因此,如果您获得资源的值,更改其值,然后再次获取其值,您将获得与第一次读取不同的值;然而,这显然并没有说读取本身并非无国籍。从某种意义上讲,它们是无状态的,它们代表了每个呼叫的相同动作(或更确切地说,资源)。必须使用另一个RESTful API手动完成更改,以更改资源值,然后将在下一次调用中反映出来。
但是,如果我们的资源在没有手动标准API动词的情况下发生变化,会出现什么情况? 例如,假设我们有一个资源来计算访问某些其他资源的次数。或者从其他一些第三方数据填充的其他资源。显然,这仍然是无国籍协议。
此外,在某种意义上,几乎任何系统(例如,包含身份验证机制的任何系统)对相同的API调用都会有不同的响应,具体取决于用户的权限。然而,显然,RESTful系统不被禁止对其用户进行身份验证......
简而言之,无状态系统就该协议而言是无状态的。如果Google跟踪调用,那么如果我在同一会话中调用相同的资源 ,我会得到不同的答案,然后它会打破无状态要求。但只要返回的响应由于应用程序级别数据而不同,并且与会话无关,则不会破坏此要求。
AFAIK,Google所做的并不一定与会话有关。如果同一用户将在完全相同的条件下(例如,IP,地理位置,操作系统,浏览器等)运行相同的搜索,则他们将得到相同的响应。如果一个新的相同搜索会因谷歌在上次调用中“学习”而产生不同的结果,那么它仍然是无状态的,因为 - 再次 - 如果在另一个会话中完成第二次调用会产生相同的结果但是在相同的条件下。
答案 2 :(得分:3)
你应该从Fielding对cookies in his thesis的评论开始,然后回顾Fielding在rest-discuss上发表的进一步想法。
我对菲尔丁思想的解释适用于这个问题:不,这不是REST。搜索结果会根据请求中cookie头的状态而改变,也就是说资源的表示会根据cookie而改变,也就是说,cookie头中会捕获部分资源的标识符。 / p>
Cookie的大多数问题都是由于能见度的提高, 这会影响缓存和超文本应用程序引擎--Fielding,2003
实际上,缓存似乎并不是Google的重中之重;返回的表示包含一个缓存控制私有头,它限制了中间组件的参与。