多个 REST API 方法可以共享同一个控制器 class 吗?
Is it OK for multiple REST API methods to share same controller class?
最好的做法是将每个不同的 Get
方法放在其自己的控制器中 class,还是拥有多个(相关和不相关的)API 方法是否完全正确同样class,如果方法很简单,不复杂。
例如这两个 API 方法在同一个控制器 class 中运行良好,但它们在自己的 class 中会更好吗?
如果是,为什么?
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);
}
}
}
一旦控制器的路由不同并且不会导致当前或其他控制器中的路由冲突,就没有什么可以阻止您在控制器中执行多个操作。
以您提供的示例为例。您可以利用控制器的路由前缀来帮助组织类似的路由
[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);
}
}
就我个人而言,我会将相关的 API 相关操作放在 1 个控制器 class 中一起工作。
在您给出的示例中,将它们放在一起就可以了。另一个例子,假设你有一个控制器来处理用户模型上的所有操作(请注意不是完全有效的代码,但希望你明白了要点):
[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
}
}
如您所见,所有这些操作都适用于用户模型,因此它们适合放在控制器中 class。
最好的做法是将每个不同的 Get
方法放在其自己的控制器中 class,还是拥有多个(相关和不相关的)API 方法是否完全正确同样class,如果方法很简单,不复杂。
例如这两个 API 方法在同一个控制器 class 中运行良好,但它们在自己的 class 中会更好吗?
如果是,为什么?
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);
}
}
}
一旦控制器的路由不同并且不会导致当前或其他控制器中的路由冲突,就没有什么可以阻止您在控制器中执行多个操作。
以您提供的示例为例。您可以利用控制器的路由前缀来帮助组织类似的路由
[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);
}
}
就我个人而言,我会将相关的 API 相关操作放在 1 个控制器 class 中一起工作。
在您给出的示例中,将它们放在一起就可以了。另一个例子,假设你有一个控制器来处理用户模型上的所有操作(请注意不是完全有效的代码,但希望你明白了要点):
[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
}
}
如您所见,所有这些操作都适用于用户模型,因此它们适合放在控制器中 class。