HTTP GET 设置内部数据,还算 RESTful?

HTTP GET setting internal data, still considered RESTful?

据我了解,HTTP GET 请求应该 return 请求的数据,如果安全(只读)和幂等(无副作用),则被视为 RESTful。

但是,我想实现一项服务来显示自上次使用 /items/userid/new 的 URI 访问以来的新项目,它可以是 RESTful 吗?

当 returning 数据时,应将响应 GET 请求而发送的项目标记为已读,以便跟踪新内容。标记这些项目将违反安全要求和幂等要求。

这是否意味着 .../new 从未被考虑 RESTful?

非常有趣的问题。我认为答案是 "depends on the implementation",因为有不同的解决方案都可以满足业务需求。

如果同一用户每次访问 URL /items/userid/new 都会修改数据库记录,那么它就不是 "safe method" 并且不符合普遍接受的 REST 模式。

如果您过滤视图中的新项目,但每次 GET 调用都没有任何相应的数据库更改,那么它肯定是 RESTful。例如:

/items/userid/new?lastvisit=2015-12-31

/items/userid/new?last_id=12345

或者在客户端存储已查看项目的列表肯定符合条件。

通常我们决定 restful 服务并将协议方法关联到它。在 HTTP 的情况下,我们使用 GET、POST、PUT...等。通常使用 Get 获取一些将使用超文本呈现的应用程序状态。

这里/items/userid/new可以是returns列表中的新服务。在此列表上的任何修改将是具有不同方法关联的后续请求。

跟踪已访问的项目不应该是服务器的责任。客户应该记住已经访问过的项目。这导致更好的可扩展性和松耦合系统,因为服务器不能处理这些参数,例如千名客户。

要提供新鲜的商品,您可以像 Cahit 已经提到的那样,提供一个 Feed,其中包含某个时间范围内的所有商品或固定数量的商品。通常 archived feed 是一个不错的选择。

因此,客户端可以自行抓取您的供稿以检索所有新项目。

确实是个有趣的问题。

对于普通的url,我不会做。例如,一个原因:我记得发送了一封带有唯一 link 指向我们自己的网络服务器的测试邮件。在通过 ISP 的邮件服务器时,向我们的服务器发出了 url 的请求。这是由垃圾邮件过滤器完成的,以检查 url 是否存在。因此,如果邮件被发送到客户说“在这里寻找新商品”,那些甚至在收到邮件之前就会消失。

而且您肯定不希望那个普通的 url 出现在某处的搜索结果中,或用于 预加载 页面。

另一方面,如果请求是在登录期间发出的(或使用 cookie),它可能没问题。

也许这就是我们查看 statistics/responses 时 SO 所做的。