这会破坏RESTful API的无状态吗?

时间:2016-06-30 09:38:10

标签: rest restful-architecture

采用这种API设计:

  • /articles/{id} - 返回一篇文章。客户端在标题中提供标记以识别它们。
  • /updated-articles - 返回自客户端上次调用此端点以来已更新的文章集合,并且仅包含此客户端先前请求的文章。客户端在标题中提供标记以识别它们。

第二个问题与我的关系并不合适。第二个要点的设计动机是客户端不需要跟踪他们上次请求的时间。这是否打破了无国籍状态" RESTful API的约束?另一种方法是/updated-articles?since=YYYY-MM-DD,但这需要客户记住

3 个答案:

答案 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代码。