REST API 用于动态计算的资源(尚不存在)

REST API for resources computed on the fly (that don't exist yet)

(此处爱好码农,多多包涵)

我尝试搜索这个但找不到模式或答案让我感到困惑,因为这一定是一个常见问题?

我正在编写一个简单的股票估值服务。我的 API 采用股票代码,例如"stockdata/GOOG" 和 returns 一些计算的统计数据。当然,基础股票数据经常变化,所以我需要时不时地重新计算。我正在努力研究如何优雅地处理两件事

1) 用户请求股票我的服务还没有看到:鉴于有 10000 种证券,预先计算它们似乎不合理,也没有必要。 REST 明智的做法让我感到困惑,但据我所知,如果我没有数据,我真的应该 return 404。问题是,假设股票有效,我能够获取基础数据并计算我自己的分数。我应该怎么做?目前,我确实将刷新作为副作用,但这看起来很讨厌。想到的唯一其他 REST 方法是要求用户 PUT/POST 符号(无数据),这可能会触发我 create/calculate。这让我觉得很奇怪,因为我看到的所有示例都包含这些方法,这些方法提供了大量额外的数据来呈现该资源。 (我所需要的只是符号本身,我的服务可以完成剩下的工作。即 GET 包含我 calculate/create 资源所需的所有信息)

2) 刷新状态:由于数据一直在变化,我想重新计算但最多每天一次,否则我会不必要地敲击源服务器。与上面一样,我应该如何触发刷新?目前,我的 GET 检查货币并在它超过一天时进行更新,但这似乎又不是 RESTy。我是否应该 return 陈旧数据,然后再次将其留给用户再次调用以请求更新?这是一个很好的补丁用例吗?

对于这些 POST/PUT/PATCH,您推荐我的有效载荷应该是什么样的?

谢谢, 七级

您混淆了 "I have no cached data" 和 "there is no data"。客户并没有真正创建或更新数据,他们想要获得最新版本。 GET 应该可以正常工作。如果您作为提供者需要做一些工作才能 return 最新版本,那很好,它仍然是 GET。

这同样适用于更新。用户想要数据的当前版本,因此他们应该使用 GET。如果数据发生变化,那么他们将获得新版本,否则他们将获得旧版本。普通网页的工作方式相同,网络服务器 return 是当前版本,有时数据会更改。

如果您知道何时更改数据,最好使用 return a Cache-Control header 和 max-age 或使用 Expires header 或两者兼而有之。这样客户就知道他们可以缓存旧数据,但不能永远缓存。

The thing is, assuming the stock is valid I'm able to fetch the underlying data and compute my own scores. How should I do this? Currently, I do refresh as a side effect, but that seems nasty

将其视为 GET,其中的实现对其自身的缓存有副作用,这很好。这是菲尔丁在 2002 年支持该职位的照片。

HTTP does not attempt to require the results of a GET to be safe. What it does is require that the semantics of the operation be safe, and therefore it is a fault of the implementation, not the interface or the user of that interface, if anything happens as a result that causes loss of property (money, BTW, is considered property for the sake of this definition).

您想执行一系列副作用(读取某些状态,可能更新您的本地缓存)这一事实是一个实现细节,客户不感兴趣。

As data changes all the time I want to recompute but at max once per day as otherwise I hammer the source servers unnecessarily. As with the above how should I trigger refresh? At the moment, my GET checks currency and updates if it's older than a day, but again that doesn't seem RESTy.

您要问的问题是:您的实现应如何管理其缓存?答案几乎是“任何你想要的方式”。为最近计算的结果存储一个年龄,然后重新使用它,是一件非常正常的事情。客户真正关心的是您返回的是缓存表示还是新计算的表示。

一个你没有问的问题:如果你每天只刷新一次本地副本,那么客户端更频繁地检查更新没有多大意义。 HTTP 标准包括 caching semantics,为您提供了一种向客户端传达 freshness/invalidation 语义的标准方式。