用于查询和命令操作的REST URI模板

Ben*_*ter 6 rest asp.net-web-api

我们有一个应用程序分为两部分:

  1. 管理员 - 数据更改的位置
  2. 公共 - 读取数据的位置

我正在寻找创建REST API来提供此功能.很容易看出如何表示CRUD操作,但我不确定单个资源上的特定操作(命令).例如,为了"发布",Project我们发送一个"PublishCommand".我们不会将ProjectPublished属性设置为的完全返回到服务器true.

在类似的说明中,我对如何在不被归类为RPC类型服务的情况下代表更高级的资源查询操作感到困惑.

下面我列出了我的Project资源的URI模板.我是否正在创建真正的RESTful API?

ADMIN API
---------

// Project Resources
GET /projects -- get all projects
POST /projects -- create a new project

// Project Resource
GET /projects/10 -- get project with id 10
PUT /projects/10 -- update project with id 10
DELETE /projects/10 -- delete project with id 10

// Project Resource Operations
POST: /projects/10/publish -- publish project with id 10
POST: /projects/10/unpublish -- unpublish project with id 10
POST: /projects/10/setposition/2 -- move to position 2 in projects list

// Project Sub resources (identity is local to project)
POST: /projects/10/media -- adds media to project with id 10
PUT: /projects/10/media/5 -- updates media id 5 for project id 10
DELETE: /projects/10/media/5 -- deletes media id 5 from project id 10

PUBLIC API
----------

GET: /projects -- gets all projects (with default limit e.g. first 10)
GET: /projects?skip=10&take=10 -- gets projects 11 to 20
GET: /projects/tagged/rest OR /taggedprojects/rest -- gets projects tagged with "REST"
GET: /projects?orderbydesc=publishdate OR /latestprojects -- gets latest projects

GET: /projects/10 -- gets project with id 10
Run Code Online (Sandbox Code Playgroud)

Den*_*aub 5

我不认为REST仅用于表示CRUD操作.你的界面看起来很好,我相信你走的正确.

有关DDD和REST的在线讨论:RESTful SOA或域驱动设计 - 妥协?由沃恩弗农.

更新以包含我在下面做出的评论:

您可以使用GET查询yor读取模型.要改变您的域,您可以PUT或POST到代表命令的资源.这将提供除CRUD之外的域模型的丰富性,并仍然使用HTTP的固有语义.

  • @Aliostad我认为他正在使用POST创建项目时正确传达操作.发布/取消发布是由"服务"启动/执行的操作/命令,因此POST也是正确的,我认为它更明确,然后对已发布属性设置为true/false的项目执行PUT. (2认同)
  • @BenFoster将REST接口限制在域概念中是非常有限的.您需要能够创建不直接映射到域的新资源,以克服仅使用有限的HTTP方法集的限制. (2认同)