rest - 使用 CQRS 的 RESTful API 设计
问题描述
我知道这个Q/A。答案对我的情况没有多大帮助。
我正在设计一个基于 CQRS 的 RESTful 服务,该服务提供现有帐户的当前信誉。信誉计算最多可能需要 30 秒。
由于计算时间长,并且由于其他原因我们希望在此使用 CQRS,整个过程在两个(或更多)请求中完成:
第一个请求
- 客户端告诉 RESTful 服务开始计算帐户。
- RESTful 服务基本上响应“OK”并让另一个服务开始计算。
后续请求
- 客户端向 RESTful 服务询问计算的信誉分数(如果可用)。
- RESTful 服务以信誉分数或仍在计算的注释进行响应。
问题 #1
我应该如何构造第一个请求 URI?对于 account number 12345
,它应该类似于以下之一吗?
PUT /accounts/12345 payload: {}
我担心这种方法,因为我读到PUT 应该是幂等的。
另外一个选项:
POST /accounts/12345 payload: {} // ...but shouldn't POST contain the whole entity in the payload?
...或者,也许将实体从帐户更改为命令...
POST /command/reputation-calculation/12345 payload: {} // ...feels like we're getting off-course here
...或者是其他东西?
问题2
对于第二个请求,这似乎更简单一些。URI 应该是这样的吗?
GET /accounts/12345/reputations
我很欣赏你的建议。谢谢。
解决方案
我可能已经找到了答案。它涉及将 CQRS 从客户端移开,并进入 RESTful 服务的控制,该服务可以选择性地使用它。
对于每个客户端请求,URI 可以是:
GET /accounts/12345/reputations
收到后,RESTful 服务可以检查最近计算的信誉是否可用。如果最近的信誉可用,RESTful 服务会回复一个200 OK
状态并提供包含该信誉的响应负载。
如果最近没有可用的信誉(根据计算服务也不是在处理中),则 RESTful 服务将进入 CQRS 模式。它告诉计算服务开始计算信誉。
然后,无论是它发起了计算,还是找到了一个已经在进行中的计算,它都会返回给客户端a 202 Accepted
,并带有后续链接。
根据文档,这种异步情况似乎是202 Accepted
响应的意图。
推荐阅读
- javascript - 使用 Next JS 和 Commerce.js 获取产品永久链接和 ID
- javascript - 有没有办法告诉我何时收到带有 node/express 的 ajax 请求?
- python - 在python中对多字典进行排序
- reactjs - React PWA Service Worker 在本地工作,但在 Netlify 上托管时不能
- vba - 使用 Do 循环的 VBA 计时器
- ios - 如何获取后台任务调度程序标识符 Xcode
- flutter - Flutter使用collectionGroup从firestore获取数据
- vue.js - Vue 文件在 dev 和 prod 之间生成的 HTML 的差异
- google-sheets - 如何在 Google 表格中使用 Arrayformula 的查询功能?
- macos - 从本地集群访问本地进程