【问题标题】:Resources that don't persist data不持久化数据的资源
【发布时间】:2019-10-17 02:44:24
【问题描述】:

JSON-API 要求我提供id 与我们创建和移动的资源。但是我们如何处理资源没有自然 ID 的情况呢?

一个很好的例子是一个报价系统,价格需要在服务器端确定。在这种情况下,我们不会给客户端提供价格手册来自行计算价格,客户端需要向 API 提交一些内容,以便服务器确定价格。

但是,我们不希望将报价保留到数据库中,因为它在技术上并未“锁定”,客户端只是在继续之前使用选项”

我想到的一种方法是为处于挂起状态的报价创建一个 UUID

例如

POST /quotes
{ "data": { "type": "quotes", "attributes": { 
    "state": "pending", <all the items> 
    } }
returns
{ "data": { "type": "quotes", "id": <UUID>, "attributes": { 
    "price": 900, "state": "pending", <all the items> 
    } }

现在我在响应中有价格,但我还不能在定义的 URL 上得到它,比如 /quote/1234。

然后,一旦状态更新为“已报价”,我就可以将其实际保存到 DB,获取正确的 ID,然后客户可以 GET /quote/1234 来查看提交的报价及其价格。

另一种方法是创建意图资源,以模拟获得价格或完成某些工作流程的意图。我只是不知道您将如何在 JSON-API 上下文中实现它,因为同样没有 ID。

应该如何处理这些动态/计算/短暂的资源端点?

【问题讨论】:

    标签: rest json-api


    【解决方案1】:

    我将为这些报价前请求创建一个单独的表。我可以想到几个原因,为什么您希望将这些捕获在数据库中,您可以拥有各种指标,例如他们使用选项的次数,在什么时间,创建实际报价需要多长时间等. 然后您可以限制这些请求,您可以停止此类请求的垃圾邮件等。

    一旦预报价变成实际报价,此时您可以将数据移动到您的报价表并可以正确使用 API,因为您现在可以使用来自预报价的 ID。在我看来,如果您只是将它们存储在数据库中并从一开始就为它们分配一个正确的 ID,那么您就可以简化一切。

    【讨论】:

    • 所以我同意这一点,即使持久性是服务器端缓存(例如 redis 键)。然而,有趣的是你用不同的名字(前引号)给这个东西命名,这让我想知道我是否应该将它视为不同的资源类型?
    • 确实,在我看来,这是一个完全不同的资源
    • 冒着偏离主题的风险(但在我的原始问题中引用了它)为这类事情创建工作流/意图资源不是更好吗?可以管理报价在其生命周期中的状态的东西?但是...保持前报价/报价相同,因为它们的数据是相同的
    • 你可以,但是如果你没有把它们放在任何地方,而客户想和你谈谈其中一个,那你怎么办?你确定你没有把这复杂化太多吗?另外,当您实际上并没有创建任何资源时,谈论创建资源感觉有点奇怪
    • 哦,我 100% 确定我把它复杂化了。我只是碰巧知道项目的范围将发展到哪里,并且正在尽职调查。到目前为止,我倾向于代表事物而非工作的简单 JSON-API 资源
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-15
    • 1970-01-01
    • 1970-01-01
    • 2020-07-30
    • 1970-01-01
    • 1970-01-01
    • 2021-09-24
    相关资源
    最近更新 更多