多个 REST API 方法可以共享同一个控制器类吗?
Posted
技术标签:
【中文标题】多个 REST API 方法可以共享同一个控制器类吗?【英文标题】:Is it OK for multiple REST API methods to share same controller class? 【发布时间】:2019-01-04 12:47:36 【问题描述】:最好的做法是将每个不同的Get
方法放在它自己的控制器类中,还是在同一个类中有多个(相关和不相关)API 方法非常好,如果方法非常简单并且不复杂。
例如这两个 API 方法在同一个控制器类中工作正常,但在自己的类中会更好吗?
如果是,为什么?
public class TestController : ApiController
[HttpGet]
[Route("api/test/ping")]
public IHttpActionResult Ping()
try
return Ok("HELLO");
catch (Exception ex)
return Content(HttpStatusCode.InternalServerError, ex.Message);
[HttpGet]
[Route("api/test/echo/message")]
public IHttpActionResult Echo(string message)
try
return Ok(message);
catch (Exception ex)
return Content(HttpStatusCode.InternalServerError, ex.Message);
【问题讨论】:
在一个控制器中拥有多个 getter 是完全合法的,尤其是当它们的路由应该相似时。 除了下面的答案,我是否可以建议研究面向服务的架构。我认为它会让你思考很多问题,比如“这种方法应该去哪里,因为我有一些服务/控制器,但它们都不适合这种方法。” 【参考方案1】:一旦它们的路由不同并且不会在当前或其他控制器中引起路由冲突,没有什么可以阻止您在控制器中执行多个操作。
以您提供的示例为例。您可以利用控制器的路由前缀来帮助组织类似的路由
[RoutePrefix("api/test")]
public class TestController : ApiController
//GET api/test/ping
[HttpGet] [Route("ping")]
public IHttpActionResult Ping()
return Ok("HELLO");
//GET api/test/echo/hello%20world
[HttpGet] [Route("echo/message")]
public IHttpActionResult Echo(string message)
if(message == null)
return BadRequest();
return Ok(message);
【讨论】:
【参考方案2】:就我个人而言,我会将相关的 API 操作放在一起做相关工作的 1 个单个控制器类中。
在您给定的示例中,将它们放在一起就可以了。另一个例子,假设你有一个控制器来处理用户模型上的所有操作(请注意不是完全有效的代码,但希望你明白这一点):
[RoutePrefix("api/users")]
public class UserController: ApiController
[HttpGet]
public IHttpActionResult GetUsers()
// GET all users.
[HttpGet]
[Route("id")]
public IHttpActionResult GetUserById(int id)
// GET user by ID
[HttpPost]
public IHttpActionResult CreateUser()
// Create User
[HttpPut]
[Route("id")]
public IHttpActionResult UpdateUser()
// Update User
如您所见,所有这些操作都适用于 User 模型,因此它们组合在一个 Controller 类中。
【讨论】:
以上是关于多个 REST API 方法可以共享同一个控制器类吗?的主要内容,如果未能解决你的问题,请参考以下文章
通过 REST API 创建 Firebase 控制台动态链接
Web API 控制器中多个 HttpPost 方法的共享逻辑
创建 REST API 时使用 Laravel 嵌套动态资源控制器的正确方法
如果 REST 控制器类和接口具有使用 @HystrixCommand 注释的 API,则不会加载所有 REST API