首页 > 解决方案 > 使用 CQRS 的 RESTful API 设计

问题描述

我知道这个Q/A。答案对我的情况没有多大帮助。

我正在设计一个基于 CQRS 的 RESTful 服务,该服务提供现有帐户的当前信誉。信誉计算最多可能需要 30 秒。

由于计算时间长,并且由于其他原因我们希望在此使用 CQRS,整个过程在两个(或更多)请求中完成:

第一个请求


后续请求


问题 #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

我很欣赏你的建议。谢谢。

标签: restcqrs

解决方案


我可能已经找到了答案。它涉及将 CQRS 从客户端移开,并进入 RESTful 服务的控制,该服务可以选择性地使用它。

对于每个客户端请求,URI 可以是:

GET /accounts/12345/reputations

收到后,RESTful 服务可以检查最近计算的信誉是否可用。如果最近的信誉可用,RESTful 服务会回复一个200 OK状态并提供包含该信誉的响应负载。

如果最近没有可用的信誉(根据计算服务也不是在处理中),则 RESTful 服务将进入 CQRS 模式。它告诉计算服务开始计算信誉。

然后,无论是它发起了计算,还是找到了一个已经在进行中的计算,它都会返回给客户端a 202 Accepted,并带有后续链接。

根据文档,这种异步情况似乎是202 Accepted响应的意图。


推荐阅读