【问题标题】:How to design for non-CRUD operations in MVC4's Web API?如何在 MVC4 的 Web API 中设计非 CRUD 操作?
【发布时间】:2012-07-10 01:20:08
【问题描述】:

我正在使用 ASP.NET MVC4 和 Visual Studio 2012 开始一个新项目。在 API 设计方面,大多数示例都侧重于通过实体上的 PUT、GET、POST 和 DELETE 动词的基本 CRUD 操作(如您所料)。我正在阅读以下内容:

http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web-api

文章建议,如果我选择将路线映射为

routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}/{action}",
    defaults: new { action = RouteParameter.Optional }
);

这更像是一种 RPC 风格的方法;从中我推断他们推荐了两条带有两个控制器的路线来拆分每个操作:

可能类似于父实体 CRUD:

routes.MapHttpRoute(
    name: "Parent",
    routeTemplate: "api/{controller}/{id}/{action}",
    defaults: new { id = RouteParameter.Optional }
);

对于子实体 CRUD:

routes.MapHttpRoute(
    name: "Child",
    routeTemplate: "api/user/{id}/{controller}",
    defaults: new { id = RouteParameter.Optional }
);

从数据/crud 的角度来看,这完全有道理。但是,当您想对实体(即 /User/NoahBawdy/SignIn/User/NoahBawdy/ChangePassword)执行非 crud 操作时怎么办?我可以看到这些是 PUT 或 POST 操作,但它真的需要它自己的控制器吗?这是为这些类型的操作处理 API 设计的错误方法吗?

任何见解一如既往地受到高度赞赏。

【问题讨论】:

    标签: c# rest asp.net-web-api


    【解决方案1】:

    您在帖子中提出了一些有趣的观点。我正在从事的一个项目中遇到了类似的挑战,我的方法是在路由配置上添加一个操作参数。

    通过该更改,我可以将任何方法添加到控制器并从客户端调用它。这避免了为概念上属于同一控制器的方法指定多个控制器的需要。

    奥马尔

    【讨论】:

    • 感谢您的意见;这几乎也是我的想法。我很想知道是否有其他人会权衡这个主题(即,它在概念上是错误/正确的);虽然这个问题的流量似乎很轻。
    • 我最终选择了这条路,我认为在适当的情况下混合使用 RESTful ApiControllers 并在必要的情况下使用面向动作的 ApiControllers 是公平的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-19
    • 2016-04-09
    • 1970-01-01
    • 2017-06-04
    • 2012-12-19
    • 1970-01-01
    相关资源
    最近更新 更多