不持久化数据的资源

Resources that don't persist data

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

一个很好的例子是需要在服务器端确定价格的报价系统。在这种情况下,我们不会给客户价格手册来自己计算价格,客户需要向 API 提交一些东西,这样服务器才能确定价格。

但是,我们不希望将报价持久保存到数据库中,因为它在技术上不是 "locked in",客户端只是在继续之前使用选项

我想到的一种方法是为待定状态的报价创建一个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> 
    } }

现在我在响应中有了价格,但我还不能像 /quote/1234 那样以定义的 url 获得它。

然后一旦状态更新到 "quoted",我就可以物理保存到数据库,获得一个正确的 ID,客户端可以 GET /quote/1234 查看提交的报价及其价格。

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

应该如何处理这些 dynamic/calculated/ephemeral 资源端点?

我会为这些 pre-quote 请求创建一个单独的 table。我可以想到几个你希望将这些捕获在数据库中的原因,你可以有各种各样的指标,比如他们玩这些选项的次数,在什么时间,他们花了多长时间来创建一个实际的报价等等.然后你可以限制那些请求,你可以阻止这些请求的垃圾邮件等

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