RESTful 网络请求和用户 activity 跟踪网站
RESTful web requests and user activity tracking websites
几天前有人问我这个问题,我没有回答:
As HTTP is a stateless protocol. When we open www.google.com, can it
be called a REST call?
我的看法:
当我们搜索 google.com 时,所有信息都通过 cookie 和 URL 参数传递。它看起来像一个无状态的请求。
但是搜索结果并不独立于用户过去的请求。搜索结果特定于用户的兴趣和行为。现在,它看起来不像是无状态请求。
我知道这是一个老问题,我已经阅读了很多像 这样的答案,但我仍然无法理解当用户 activity 像 [=29= 一样被跟踪时会发生什么] 或亚马逊(基于过去购买的推荐)或任何其他基于用户 activity 的推荐网站。
是RESTful还是RESTless?
如果我想创建一个使用 REST 架构并仍然提供用户特定响应的 Web 应用程序怎么办?
你或许应该从 Fielding 对 cookies in his thesis, and then review Fielding's further thoughts, published on rest-discuss 的评论开始。
我对 Fielding 思想的解释,应用于这个问题:不,它不是 REST。搜索结果根据请求中cookieheader的状态而变化,也就是说资源的表示根据cookie的变化而变化,也就是说资源的标识符的一部分被捕获在饼干 header.
Most of the problems with cookies are due to breaking visibility,
which impacts caching and the hypertext application engine -- Fielding, 2003
碰巧,缓存似乎并不是 Google 的首要任务;返回的表示包含一个缓存控制私有 header,它限制了中间组件的参与。
HTTP 是无状态的,但是 Google 应用层不是。具体的Cookies及其含义是Application Layer的一部分。
考虑与 TCP/IP 相同的问题。 IP 是无状态协议,但 TCP 不是。 IP数据包中嵌入的TCP状态的存在并不意味着IP协议本身也有状态。
那么这是否使其成为 REST 调用?没有。
虽然 HTTP 是无状态的,但我怀疑 www.google.com 在禁用 cookie 的情况下请求时,每个请求的结果都是相同的,这使得它几乎是无状态的(Google 仍然可能跟踪 IP 到限制请求频率)。
但是应用层并不是无状态的。 REST 的原则之一是系统不会为了修改响应而在请求之间保留有关客户端的状态数据。在 Google 的情况下,这显然没有发生。
似乎 "stateless" 的含义(假设地)超出了实际表达范围。
考虑一个完全没有数据库的网络系统。你调用一个 (RESTful) API,你总是得到完全相同的结果。这是完全无状态的...但这也不是真正的系统。
一个真实的系统,几乎在每一个实现中,都保存着数据。此外,该数据是 RESTful API 允许我们访问的 "resources"。当然,由于 API 调用,数据也会发生变化。所以,如果你获取一个资源的值,改变它的值,然后再次获取它的值,你将得到与第一次读取不同的值;然而,这显然并不是说读取本身不是无状态的。它们是无状态的,因为它们代表每次调用的相同操作(或更准确地说,资源)。更改必须手动完成,使用另一个 RESTful API 来更改资源值,然后将反映在下一次调用中。
但是,如果我们的资源在没有手动、标准 API 动词的情况下发生变化,情况会怎样?
例如,假设我们有一个资源可以计算其他资源被访问的次数。或者从其他第三方数据中填充的其他资源。很明显,这仍然是一个无状态的协议。
此外,从某种意义上说,几乎任何系统——比如说,任何包含身份验证机制的系统——都会对相同的 API 调用做出不同的响应,例如,这取决于用户的权限。然而,很明显,RESTful 系统并未禁止对其用户进行身份验证...
简而言之,为了该协议,无状态系统是无状态的。如果 Google 跟踪调用,这样如果我在同一个会话 中调用相同的资源 我会得到不同的答案,那么它就打破了无状态要求。但只要返回的响应因应用程序级数据而不同,并且与会话无关,就不会违反此要求。
AFAIK,Google 所做的不一定与会话相关。如果同一用户运行在完全相同的条件下(例如IP、地理位置、OS、浏览器等)进行相同的搜索,他们将得到完全相同的响应。如果由于 Google 在上次调用中具有 "learnt" 的原因,新的相同搜索将产生不同的结果,它仍然是无状态的,因为 - 再一次 - 第二次调用会产生完全相同的结果,如果它是在另一个会话中完成的,但条件相同。
几天前有人问我这个问题,我没有回答:
As HTTP is a stateless protocol. When we open www.google.com, can it be called a REST call?
我的看法:
当我们搜索 google.com 时,所有信息都通过 cookie 和 URL 参数传递。它看起来像一个无状态的请求。 但是搜索结果并不独立于用户过去的请求。搜索结果特定于用户的兴趣和行为。现在,它看起来不像是无状态请求。
我知道这是一个老问题,我已经阅读了很多像 这样的答案,但我仍然无法理解当用户 activity 像 [=29= 一样被跟踪时会发生什么] 或亚马逊(基于过去购买的推荐)或任何其他基于用户 activity 的推荐网站。
是RESTful还是RESTless?
如果我想创建一个使用 REST 架构并仍然提供用户特定响应的 Web 应用程序怎么办?
你或许应该从 Fielding 对 cookies in his thesis, and then review Fielding's further thoughts, published on rest-discuss 的评论开始。
我对 Fielding 思想的解释,应用于这个问题:不,它不是 REST。搜索结果根据请求中cookieheader的状态而变化,也就是说资源的表示根据cookie的变化而变化,也就是说资源的标识符的一部分被捕获在饼干 header.
Most of the problems with cookies are due to breaking visibility, which impacts caching and the hypertext application engine -- Fielding, 2003
碰巧,缓存似乎并不是 Google 的首要任务;返回的表示包含一个缓存控制私有 header,它限制了中间组件的参与。
HTTP 是无状态的,但是 Google 应用层不是。具体的Cookies及其含义是Application Layer的一部分。
考虑与 TCP/IP 相同的问题。 IP 是无状态协议,但 TCP 不是。 IP数据包中嵌入的TCP状态的存在并不意味着IP协议本身也有状态。
那么这是否使其成为 REST 调用?没有。
虽然 HTTP 是无状态的,但我怀疑 www.google.com 在禁用 cookie 的情况下请求时,每个请求的结果都是相同的,这使得它几乎是无状态的(Google 仍然可能跟踪 IP 到限制请求频率)。
但是应用层并不是无状态的。 REST 的原则之一是系统不会为了修改响应而在请求之间保留有关客户端的状态数据。在 Google 的情况下,这显然没有发生。
似乎 "stateless" 的含义(假设地)超出了实际表达范围。
考虑一个完全没有数据库的网络系统。你调用一个 (RESTful) API,你总是得到完全相同的结果。这是完全无状态的...但这也不是真正的系统。
一个真实的系统,几乎在每一个实现中,都保存着数据。此外,该数据是 RESTful API 允许我们访问的 "resources"。当然,由于 API 调用,数据也会发生变化。所以,如果你获取一个资源的值,改变它的值,然后再次获取它的值,你将得到与第一次读取不同的值;然而,这显然并不是说读取本身不是无状态的。它们是无状态的,因为它们代表每次调用的相同操作(或更准确地说,资源)。更改必须手动完成,使用另一个 RESTful API 来更改资源值,然后将反映在下一次调用中。
但是,如果我们的资源在没有手动、标准 API 动词的情况下发生变化,情况会怎样? 例如,假设我们有一个资源可以计算其他资源被访问的次数。或者从其他第三方数据中填充的其他资源。很明显,这仍然是一个无状态的协议。
此外,从某种意义上说,几乎任何系统——比如说,任何包含身份验证机制的系统——都会对相同的 API 调用做出不同的响应,例如,这取决于用户的权限。然而,很明显,RESTful 系统并未禁止对其用户进行身份验证...
简而言之,为了该协议,无状态系统是无状态的。如果 Google 跟踪调用,这样如果我在同一个会话 中调用相同的资源 我会得到不同的答案,那么它就打破了无状态要求。但只要返回的响应因应用程序级数据而不同,并且与会话无关,就不会违反此要求。
AFAIK,Google 所做的不一定与会话相关。如果同一用户运行在完全相同的条件下(例如IP、地理位置、OS、浏览器等)进行相同的搜索,他们将得到完全相同的响应。如果由于 Google 在上次调用中具有 "learnt" 的原因,新的相同搜索将产生不同的结果,它仍然是无状态的,因为 - 再一次 - 第二次调用会产生完全相同的结果,如果它是在另一个会话中完成的,但条件相同。