采用这种API设计:
/articles/{id}
- 返回一篇文章。客户端在标题中提供标记以识别它们。/updated-articles
- 返回自客户端上次调用此端点以来已更新的文章集合,并且仅包含此客户端先前请求的文章。客户端在标题中提供标记以识别它们。第二个问题与我的关系并不合适。第二个要点的设计动机是客户端不需要跟踪他们上次请求的时间。这是否打破了无国籍状态" RESTful API的约束?另一种方法是/updated-articles?since=YYYY-MM-DD
,但这需要客户记住
答案 0 :(得分:3)
您的“令牌”基本上是客户端ID,记住上次访问日期的事实是在服务器上保留客户端状态。
考虑一下:如果你必须扩展你的服务,你可以简单地插入一个新的服务器,复制你的服务的文件,并通过循环算法在两个服务器中的一个或另一个上重定向(没有他们分享信息)?显然不是,因为您需要在两台服务器之间共享您的表tokens<->date of last consultation
。所以不,它绝对不是无国籍的。
另外,我不明白你的观点:
另一种方法是/ updated-articles?since = YYYY-MM-DD 但这需要客户记住
令牌不会要求客户记住吗?相反,这种方式将是RESTful,因为客户端状态(上次咨询的日期)将保留在客户端。
答案 1 :(得分:0)
基本上,不,我不认为你的第二种资源会破坏无国籍状态。
我认为让您的客户跟踪他们自己在&#39;更新后的情况是可以的。时间戳。你的api应该是无国籍的。客户不必是无国籍人。
如果客户应该保留很多状态。客户端将成为一个用户及其特定需求的核心设备。它负责跟踪用户的需求和当前状态。在这种情况下,有人将不得不存储该时间戳。我认为它应该是您的客户,而不是您的服务器。
这只是我的意见。
我确实找到了一篇关于无国籍状态的真实含义的文章,我认为这也可以使你受益here。
答案 2 :(得分:0)
我们应该避免创建没有相关实体的端点。因此,应该采用更好的方法而不是/updated-articles?since=<timestamp>
:
/articles?updated=true&since-last-request=true
或/articles?updated-since-last-request=true
如果预期结果会影响所有客户。这意味着每个请求时间戳必须保留在服务器上。或
/articles?updated-since=<timestamp>
如果预期结果取决于每个客户端行为。这似乎是你的情况。
前者或后者(或两者)之间的选择取决于用例。但重点是避免创建没有相关实体的端点,并且通过参数定义特殊情况。
作为指导原则:
端点是实质性,形容词是参数,动词是HTTP请求方法
这也意味着简单的GET /文章&#39;表示返回所有文章。为避免滥用,您可以根据具体情况发出适当的4xx代码。