另一条路线的装饰者应该做什么路线

时间:2014-07-04 14:41:44

标签: rest decorator

假设我有一个RESTful API,我发布到/doSomething以启动任务运行。此任务启动一个执行某些操作的类的实例。

如果我希望能够为该任务添加任意功能,但保持原始类完成它已经完成的大部分工作。一般的智慧是使用类上的装饰器模式来添加我想要的功能。

我的绊脚石是我无法想到将其添加到RESTful API的雄辩方式。我考虑的选项是:

  • 发布到/doSomething/andALittleMore。这会让人感到困惑,因为我可能会有多个链式装饰器,这可能会导致问题。
  • POST到/compose并为原始任务和装饰器设置一堆不同的帖子参数。这对于多个装饰者来说也很麻烦。
  • POST到/compose并将任务和装饰器的一组选项作为JSON传递。这会为某些功能添加一些参数,但JSON会是一个很大的混乱。
  • 拥有接受合成命令的路线。更麻烦,因为现在我不得不担心这将使用什么语言,可能会对该命令进行标记和解析等。
  • POST /doALittleMore并假装/doSomething不属于路线。这剥夺了URI的描述性。

我无法想到一种方法来完成我想要做的事情,并不觉得它从API中汲取了RESTfulness的精神。但REST和装饰模式已经存在了很长时间。这两种设计如何结合起来?

1 个答案:

答案 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