多个 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

yii2 rest api异常处理

在rest api app中生成laravel请求验证的最佳实践