REST 资源(文档、集合、存储)和 REST 控制器之间有什么区别?



规则:控制器名称应使用动词或动词短语 (https://medium.com/@cagline/restful-web-services-ddafb8019f2e(

资源的终结点命名必须是名词,而对于控制器,它应该是动词。所以我试图弄清楚 REST 资源(文档、集合、存储(和 REST 控制器之间的区别。

我阅读了您链接到的文章,但我不同意其所有内容或作者列出的"规则"。REST API 设计没有硬性规定。此外,在描述REST的更正式的文档中没有"控制器"的概念,因为这是一个实现问题:您可以在其他平台中构建RESTful API,而无需使用Controller+Action范式。

另一个问题是术语:在某些平台中,术语"控制器"是指函数或类方法而不是类,在其他平台(如 ASP.NET Web API(中,控制器不是类方法,而是指父类,其方法称为Actions(。

要回答您的具体问题:

所以我试图弄清楚 REST 资源(文档、集合、存储(和 REST 控制器之间的区别。

简而言之(过度简化(:通过 RESTful API 访问的资源通常是一个名词,例如业务/域实体(例如"用户"、"订单"、"产品"(或系统服务(发送电子邮件的 SMTP 服务(。

ASP.NET Web API 中,控制器是将逻辑上相关的操作分组的类 - 但控制器不限制自身仅对单个实体类型执行操作 - 并且多个控制器可以具有同一实体类型的操作。

控制器操作名称在 Web API(以及 ASP.NET 核心和 ASP.NET MVC(ASP.NET 是任意的,因为您可以使用声明 URL 路径的[Route]属性来修饰它们,该属性可以是您想要的任何内容。

例如,在我最近构建的 ASP.NET Core Web API 项目中,我将"列表"操作放在单独的控制器中,因为列出操作与 GET、POST 和 PATCH 的操作没有太多共同之处,这些操作位于它们自己的单独控制器中:

class ProductsListController : ApiController
{
[Route("/products")]
IActionResult GetAll( /* optional querystring params */ )
[Route("/products/categories/{categoryName}")]
IActionResult GetInCategory( String categoryName, /* optional querystring params */ )
}
class ProductController : ApiController
{
[Route("/products/{productId}")]
IActionResult Get( Int32 productId )
[HttpPost]
[Route("/products/{productId}")]
IActionResult Post( Int32 productId )
}

但是,在一个完全不同的项目中,它没有使用 ASP.NET Web API(但实际上在.NET Framework 2.0上运行(长话短说(,我使用.ashx文件构建了一个RESTful API,并创造性地使用WebForm的路由引擎 ASP.NET 并且为每个操作/端点都有一个单独的类(以充分利用依赖注入(, 这样:

// `MyRouteAttribute`, `MyHandler`, and `MyActionResult` are classes that belong to a mini-web-service library I wrote that can be hosted within ASP.NET WebForms but also ASP.NET Core and even completely outside of ASP.NET too.
[MyRoute( "GET", "/products")]
[MyRoute( "GET", "/products/categories/{categoryName}")]
class ProductsListHandler : MyHandler
{
MyActionResult ProcessRequest( HttpContext httpContext )
}
[MyRoute( "GET", "/products/{productId}")]
class ProductsGetHandler : MyHandler
{
MyActionResult ProcessRequest( HttpContext httpContext )
}
[MyRoute( "POST", "/products/{productId}")]
class ProductsPostHandler : MyHandler
{
MyActionResult ProcessRequest( HttpContext httpContext )
}

最新更新