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

时间:2019-12-17 03:44:17

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

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

资源的端点命名必须是名词,而对于控制器的端点命名应该是动词。因此,我试图了解REST资源(文档,集合,存储)和REST控制器之间的区别。

1 个答案:

答案 0 :(得分:1)

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

另一个问题是术语:在某些平台中,“控制器”是指函数或类方法而非类,而在其他平台(如ASP.NET Web API)中,控制器不是 < / em>一种类方法,但指的是父类,其方法称为 Actions )。

要回答您的特定问题:

  

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

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

在ASP.NET Web API中,控制器是对逻辑相关的动作进行分组的类-但是,控制器本身并不限于仅对单个实体类型执行动作-并且多个控制器可以具有针对同一实体类型的动作

在ASP.NET Web API(以及ASP.NET Core和ASP.NET MVC)中,控制器动作名称是任意的,因为您使用[Route]属性修饰了它们,这些属性声明了可以使用的URL路径。 / p>

例如,在我最近构建的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上运行的(长话)),我使用{{1} }文件和ASP.NET WebForm路由引擎的创造性使用,并且每个动作/端点都有一个单独的类(以充分利用依赖项注入),如下所示:

.ashx