即时计算资源的REST API(尚不存在)

时间:2019-03-01 08:28:19

标签: rest api-design

(这里是业余编码员,请多多包涵)

我尝试搜索此内容,但找不到模式或答案,这很常见,这使我感到困惑?

我正在写一个简单的股票评估服务。我的API使用Stock符号,例如“ stockdata / GOOG”,并返回一些计算出的统计数据。当然,基础股票数据经常变化,因此我需要时不时地重新计算。我正在尝试找出如何优雅地处理两件事

1)用户请求尚未查看我的服务的股票:鉴于存在10000股证券,因此似乎无法进行全部或全部的预先计算。 REST明智地使我困惑,但是据我了解,如果我没有数据,我应该真正返回404。问题是,假设股票有效,我就可以获取基础数据并计算自己的得分。我应该怎么做?目前,我确实会刷新,但似乎很讨厌。想到的唯一其他REST方法是要求用户PUT / POST符号(无数据),这可能会触发我创建/计算。令我感到奇怪的是,我所看到的所有示例都包括这些方法,这些方法提供了大量额外的数据来表示该资源。 (我只需要符号本身,我的服务就可以完成其余工作。即GET包含了我计算/创建资源所需的所有信息)

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

您对这些POST / PUT / PATCH的有效负载有何建议?

谢谢, 严重

2 个答案:

答案 0 :(得分:0)

您将“我没有缓存的数据”与“没有数据”混淆了。客户端实际上并没有创建或更新数据,而是希望获得最新版本。 GET应该可以正常工作。如果您作为提供者需要做一些工作才能返回最新版本,那么很好,它仍然是GET。

更新同样如此。用户需要数据的当前版本,因此他们应该使用GET。如果数据发生更改,那么他们将获得一个新版本,否则,他们将获得一个旧版本。普通网页的工作方式相同,Web服务器返回当前版本,有时数据也会更改。

如果您知道何时更改数据,则优良作法是返回具有max-age的Cache-Control标头或使用Expires标头,或同时使用两者。这样,客户知道他们可以缓存旧数据,但不能永远保存。

答案 1 :(得分:0)

  

问题是,假设股票有效,我就能提取基础数据并计算自己的得分。我应该怎么做?目前,我确实会出现副作用,但这似乎很讨厌

将此作为GET进行处理就可以了,其中实现对自己的缓存有副作用。这是菲尔丁在2002年支持该职位的情况。

  

HTTP不会尝试要求GET的结果是安全的。该操作要求操作的语义是安全的,因此,如果发生任何导致财产损失的后果,则是实现的错误,而不是接口或该接口的用户的错误。被认为是   为了这个定义)。

您想要执行许多副作用(读取某些状态,也许更新本地缓存)是一个实现细节,而客户端并不感兴趣。

  

由于数据一直在变化,所以我想重新计算,但每天最多一次,否则我会不必要地锤击源服务器。与上述一样,我应该如何触发刷新?目前,我的GET检查币种并更新币种是否超过一天,但这似乎并不是RESTy。

您要问的问题是:您的实现应如何管理其缓存?答案几乎是“您想要的任何方式”。为最近计算的结果存储一个年龄并重新使用它,这是一件很正常的事情。无论您是返回缓存的表示形式,还是返回新计算的表示形式,客户端都不必担心。

您没有问的问题:如果您每天只刷新一次本地副本,那么客户端检查更新的频率就没有太大的意义了。 HTTP标准包括caching semantics,为您提供了一种将新鲜度/无效语义传达给客户端的标准方法。