【发布时间】:2016-06-12 12:56:02
【问题描述】:
在我的项目中使用 DDD 方法。
该项目有聚合(实体)交易。这个聚合有很多用例。
对于这个聚合,我需要创建一个 rest api。
用标准:创建和删除没问题。
1) CreateDealUseCase(名称、价格和许多其他参数);
POST /rest/{version}/deals/
{
'name': 'deal123',
'price': 1234;
'etc': 'etc'
}
2) DeleteDealUseCase(id)
DELETE /rest/{version}/deals/{id}
但是如何处理其余的用例呢?
- HoldDealUseCase(id, reason);
- UnholdDealUseCase(id);
- CompleteDealUseCase(id 和许多其他参数);
- CancelDealUseCase(id, amercement, reason);
- ChangePriceUseCase(id, newPrice, reason);
- ChangeCompletionDateUseCase(id, newDate, amercement, whyChanged);
- 等(共20个用例)...
有什么解决办法?
1) 使用动词:
PUT /rest/{version}/deals/{id}/hold
{
'reason': 'test'
}
但是! url中不能使用动词(在REST理论中)。
2) 使用完成状态(将在用例之后):
PUT /rest/{version}/deals/{id}/holded
{
'reason': 'test'
}
就我个人而言,它看起来很丑。也许我错了?
3) 对所有操作使用 1 个 PUT 请求:
PUT /rest/{version}/deals/{id}
{
'action': 'HoldDeal',
'params': {'reason': 'test'}
}
PUT /rest/{version}/deals/{id}
{
'action': 'UnholdDeal',
'params': {}
}
很难在后端处理。 此外,很难记录。由于 1 个操作有许多不同的请求变体,这些变体已经依赖于特定的响应。
所有解决方案都有明显的缺点。
我在互联网上阅读了很多关于 REST 的文章。到处都是理论,我的具体问题怎么来这里?
【问题讨论】:
-
我不想将以下内容作为答案,因此如果这是一个糟糕的想法,也许其他人可以发表意见。怎么样:
/rest/{version}/dealsheld/、/rest/{version}/dealscompleted/{id}等。因为在任何情况下都需要知道您正在处理的状态。这样的方案有意义吗?