这是否打破了 RESTful API 的无国籍状态?

Does this break the statelessness of a RESTful API?

采用 API 的设计:

第二点不太适合我。第二个点的设计动机是 客户端不需要跟踪他们最后一次请求的时间 。这是否打破了 RESTful API 的 "statelessness" 约束?另一种方法是 /updated-articles?since=YYYY-MM-DD 但这需要客户记住

基本上,不,我不认为你的第二个资源会破坏无状态。

我认为让您的客户跟踪他们自己的 'updated at' 时间戳是可以的。您的 api 应该是无状态的。客户端不必是无状态的。

如果有的话,客户端应该保留很多状态。客户端将成为一个用户及其特定需求的核心设备。它负责跟踪用户的需求和当前状态。在这种情况下,必须有人存储该时间戳。我认为应该是你的客户,而不是你的服务器。

虽然这只是我的意见。

我确实找到了一篇关于无国籍真正含义的文章,我认为它对您也有帮助 here

您的 "token" 基本上是一个客户端 ID,记住他们上次访问的日期就是在服务器上保持客户端状态。

想一想:如果您必须扩展您的服务,您是否可以简单地插入一个新服务器,复制您的服务文件,并通过循环算法在两个服务器中的一个或另一个上重定向(没有让他们共享信息)?显然不是,因为您需要在两台服务器之间共享 table tokens<->date of last consultation。所以不,它绝对不是无国籍的。

另外,我不明白你的意思:

An alternative approach would be /updated-articles?since=YYYY-MM-DD but this would require clients to remember

令牌不需要客户记住吗?相反,这种方式将是 RESTful,因为客户端状态(最后一次咨询的日期)将保留在客户端。

我们应该避免创建没有相关实体的端点。因此,代替 /updated-articles?since=<timestamp> 更好的方法应该是:

  • /articles?updated=true&since-last-request=true
  • /articles?updated-since-last-request=true

如果预期结果应该影响所有客户端。这意味着每个请求时间戳都必须保存在服务器上。或者

  • /articles?updated-since=<timestamp>

如果预期的结果取决于每个客户端的行为。这似乎是你的情况。

前者或后者(或两者)之间的选择取决于用例。但要点是 避免 创建没有相关实体的端点并且有特殊情况由参数定义。

作为准则:

Endpoints are substantives, adjectives are parameters and verbs are the HTTP request methods

这也意味着一个简单的 'GET /articles' 意味着返回 ALL 篇文章。为避免滥用,您可以根据情况发出适当的 4xx 代码。