Mit*_*lik 23 rest composite-key asp.net-web-api attributerouting asp.net-web-api-routing
我在工作中遇到了一个问题,我无法找到有关在RESTful Web服务中针对主键是其他资源ID的组合的资源执行CRUD操作的通常标准或实践的信息.我们使用MVC WebApi来创建控制器.例如,我们有三个表:
Product:PK = ProductIdPart:PK = PartIdProductPartAssoc:PK =(ProductId,PartId)产品可以包含许多部件,而部件可以是许多产品的组件.关联表还包含与关联本身相关的其他信息,而不是可编辑的信息.
我们有ProductsController和PartsController类使用定义为的路由模板处理通常的GET/PUT/POST/DELETE操作:{controller}/{id}/{action}以便以下IRI工作:
/api/Products- 返回所有产品,创建新产品/api/Products/1- 检索/更新/删除产品1/api/Parts- 返回所有部件,创建一个新部件/api/Parts/2- 检索/更新/删除第2部分/api/Products/1/Parts- 获取产品1的所有部件/api/Parts/2/Products- 获取第2部分为组件的所有产品我遇到问题的方法是如何为ProductPartAssoc资源定义路径模板.获取关联数据的路由模板和IRI应该是什么样的?坚持惯例,我希望如下:
/api/ProductPartAssoc- 返回所有关联,创建关联/api/ProductPartAssoc/[1,2]- 检索/更新/删除产品1和第2部分之间的关联我的同事发现这在美学上令人不悦,并且似乎认为最好不要有一个ProductPartAssocController类,而是添加其他方法ProductsController来管理关联数据:
/api/Products/1/Parts/2- 获取产品1和第2部分之间关联的数据,而不是第2部分作为第1部分成员的数据,这通常是基于其他示例的情况,例如/Book/5/Chapter/3我在其他地方看到的情况.在一天结束时,我想我要求的是验证,或者我可以指出的方向,并说"看,这是其他人做的."
处理复合键识别的资源的典型做法是什么?
dan*_*wig 19
我也喜欢美学/api/Products/1/Parts/2.您也可以将多个路由转到同一个操作,这样您就可以加倍并提供/api/Parts/2/Products/1相同资源的备用URL.
对于POST,您已经知道复合键.那么为什么不消除POST的需要,只是使用PUT进行创建和更新?如果您的系统生成主键,则POST到集合资源URL很好,但是如果您有已知主键的组合,那么为什么需要POST?
也就是说,我也喜欢单独ProductPartAssocController包含这些URL的操作的想法.你必须做一个自定义的路由映射,但如果你使用像AttributeRouting.NET这样的东西很容易做到.
例如,我们这样做是为了管理角色中的用户:
PUT, GET, DELETE /api/users/1/roles/2
PUT, GET, DELETE /api/roles/2/users/1
Run Code Online (Sandbox Code Playgroud)
6个URL,但只有3个动作,全部在GrantsController(我们称用户和角色之间的动名词为"Grant").使用AttributeRouting.NET,类最终看起来像这样:
[RoutePrefix("api")]
[Authorize(Roles = RoleName.RoleGrantors)]
public class GrantsController : ApiController
{
[PUT("users/{userId}/roles/{roleId}", ActionPrecedence = 1)]
[PUT("roles/{roleId}/users/{userId}", ActionPrecedence = 2)]
public HttpResponseMessage PutInRole(int userId, int roleId)
{
...
}
[DELETE("users/{userId}/roles/{roleId}", ActionPrecedence = 1)]
[DELETE("roles/{roleId}/users/{userId}", ActionPrecedence = 2)]
public HttpResponseMessage DeleteFromRole(int userId, int roleId)
{
...
}
...etc
}
Run Code Online (Sandbox Code Playgroud)
这对我来说似乎是一种相当直观的方法.将操作保存在单独的控制器中也可以实现更精简的控制器.
| 归档时间: |
|
| 查看次数: |
8764 次 |
| 最近记录: |