这是否打破了 RESTful API 的无国籍状态?
Does this break the statelessness of a RESTful API?
采用 API 的设计:
/articles/{id}
- Returns 一篇文章。客户在 header 中提供一个令牌来识别它们。
/updated-articles
- Returns collection 自客户端上次调用此端点以来已更新的文章,并且仅包括此客户端先前请求的文章。客户在 header 中提供一个令牌来识别它们。
第二点不太适合我。第二个点的设计动机是 客户端不需要跟踪他们最后一次请求的时间 。这是否打破了 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 代码。
采用 API 的设计:
/articles/{id}
- Returns 一篇文章。客户在 header 中提供一个令牌来识别它们。/updated-articles
- Returns collection 自客户端上次调用此端点以来已更新的文章,并且仅包括此客户端先前请求的文章。客户在 header 中提供一个令牌来识别它们。
第二点不太适合我。第二个点的设计动机是 客户端不需要跟踪他们最后一次请求的时间 。这是否打破了 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 代码。