RESTful web请求和用户活动跟踪网站



几天前有人问我这个问题,我不知道答案:

因为HTTP是一个无状态协议。当我们打开www.google.com,就可以了被称为REST调用?

我的想法:

当我们在google.com上进行搜索时,所有信息都通过cookie和URL参数传递。它看起来像一个无状态请求。但搜索结果并不是独立于用户过去的请求。搜索结果是特定于用户兴趣和行为的。现在,它看起来不像一个无状态请求。

我知道这是一个老问题,我已经读了很多答案,像为什么HTTP是一个无状态协议?但我仍然无法理解当用户活动被跟踪时会发生什么,就像在谷歌或亚马逊(基于过去购买的推荐)或任何其他基于用户活动的推荐网站。

是rest还是RESTless?

如果我想创建一个web应用程序,我使用REST架构,仍然提供用户特定的响应?

HTTP是无状态的,但是Google应用层不是。特定的cookie及其含义是应用层的一部分。

考虑TCP/IP也是如此。IP是一种无状态协议,但TCP不是。TCP中状态的存在嵌入在IP数据包中,并不意味着IP协议本身有状态。

那么这使它成为一个REST调用吗?不。

虽然HTTP是无状态的&我怀疑在禁用cookie的情况下请求www.google.com,每个请求的结果都是相同的,使其几乎无状态(Google仍然可能跟踪IP以限制请求频率)。

但是应用层不是无状态的。REST的原则之一是,系统不会在请求之间保留关于客户端的状态数据,以便修改响应。就谷歌而言,这种情况显然没有发生。

似乎"无状态"的含义正在(假设地)超出其实际表达。

考虑一个没有数据库的web系统。调用(RESTful) API,总是得到完全相同的结果。这完全是无状态的…但这也完全不是一个真正的系统。

一个真实的系统,实际上在每一个实现中,都保存着数据。此外,这些数据是RESTful API允许我们访问的"资源"。当然,由于API调用,数据也会发生变化。所以,如果你得到一个资源的值,改变它的值,然后再得到它的值,你会得到一个不同于第一次读取的值;然而,这显然并不是说读取本身不是无状态的。它们是无状态的,因为它们表示每个调用的相同操作(或者更确切地说,是资源)。更改必须手动完成,使用另一个RESTful API来更改资源值,然后将在下一个调用中反映。

但是,如果我们的资源在没有手动的标准API谓词的情况下发生变化,情况会怎样呢?例如,假设我们有一个资源,它计算其他资源被访问的次数。或者从其他第三方数据填充的其他资源。显然,这仍然是一个无状态协议。

此外,在某种意义上,几乎任何系统——比如任何包含身份验证机制的系统——对相同的API调用的响应都是不同的,这取决于(例如)用户的权限。然而,很明显,rest式系统并不禁止对其用户进行身份验证…

简而言之,无状态系统是为了该协议而无状态的。如果Google跟踪调用,那么如果我在同一会话中调用相同的资源,我将得到不同的答案,那么它将打破无状态要求。但是,只要返回的响应由于应用程序级别的数据而不同,并且与会话无关,这个需求就不会被打破。

恕我直言,Google所做的并不一定与会话相关。如果同一用户在完全相同的条件下(例如,IP、地理位置、操作系统、浏览器等)运行相同的搜索,他们将得到完全相同的响应。如果一个新的相同的搜索将产生不同的结果,由于谷歌在上一次调用中"学到"的东西,它仍然是无状态的,因为-再次-第二次调用将产生完全相同的结果,如果它是在另一个会话中完成的,但在相同的条件下。

你可能应该从Fielding在他的论文中对cookie的评论开始,然后回顾Fielding在rest- discussion上发表的进一步的想法。

我对Fielding思想的解释,应用于这个问题:不,它不是REST。搜索结果的变化取决于请求中cookie头的状态,也就是说资源的表示取决于cookie的变化,也就是说资源标识符的一部分在cookie头中被捕获。

大多数cookie的问题都是由于破坏可见性,这会影响缓存和超文本应用程序引擎——Fielding, 2003

碰巧的是,缓存似乎并不是谷歌的首要任务;返回的表示包含一个缓存控制私有标头,它限制了中间组件的参与。

最新更新