假设我有一个RESTful API,我发布到/doSomething
以启动任务运行。此任务启动一个执行某些操作的类的实例。
如果我希望能够为该任务添加任意功能,但保持原始类完成它已经完成的大部分工作。一般的智慧是使用类上的装饰器模式来添加我想要的功能。
我的绊脚石是我无法想到将其添加到RESTful API的雄辩方式。我考虑的选项是:
/doSomething/andALittleMore
。这会让人感到困惑,因为我可能会有多个链式装饰器,这可能会导致问题。/compose
并为原始任务和装饰器设置一堆不同的帖子参数。这对于多个装饰者来说也很麻烦。/compose
并将任务和装饰器的一组选项作为JSON传递。这会为某些功能添加一些参数,但JSON会是一个很大的混乱。/doALittleMore
并假装/doSomething
不属于路线。这剥夺了URI的描述性。我无法想到一种方法来完成我想要做的事情,并不觉得它从API中汲取了RESTfulness的精神。但REST和装饰模式已经存在了很长时间。这两种设计如何结合起来?
答案 0 :(得分:0)
我建议将装饰器作为自己的端点进行管理,并将它们视为任务的集合。
GET /tasks/15/decorators - return all decorators on task 15
{
"numDecorators": 15,
"decorators": {
{
"self": "/decorators/3",
...
},
...
}
}
POST /tasks/15/decorators - add a decorator on task 15
PUT /tasks/15/decorators - modify order, add, delete
GET /decorators - return all decorators
POST /decorators - create a new decorator
等等......
另一个合理的选择是将关系拉出到自己的资源中:
GET /tasks/15
GET /decorators/7
GET /task-decorators