Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/rest/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# REST资源(文档、集合、存储)和REST控制器之间有什么区别?_C#_Rest_Api_Asp.net Web Api - Fatal编程技术网

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

C# REST资源(文档、集合、存储)和REST控制器之间有什么区别?,c#,rest,api,asp.net-web-api,C#,Rest,Api,Asp.net Web Api,规则:控制器名称应使用动词或动词短语() 资源的端点命名必须是名词,而控制器的端点命名应该是动词。因此,我试图弄清REST资源(文档、集合、存储)和REST控制器之间的区别。我阅读了您链接到的文章,但我不同意其所有内容或作者列出的“规则”REST API设计没有硬性规定。此外,在描述REST的更正式的文档中没有“控制器”的概念,因为这是一个实现问题:您可以在其他平台上构建RESTful API,而无需使用控制器+操作范例 另一个问题是术语之一:在某些平台中,术语“控制器”指的是函数或类方法,而不

规则:控制器名称应使用动词或动词短语()


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

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

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

要回答您的具体问题:

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

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

在ASP.NET Web API中,控制器是一个类,它对逻辑上相关的操作进行分组—但控制器本身不限于对单个实体类型执行操作—多个控制器可以对同一实体类型执行操作

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

例如,在我最近构建的一个ASP.NET核心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
文件和ASP.NET WebForm的路由引擎的创造性使用构建了一个RESTful API,并为每个操作/端点提供了一个单独的类(以充分利用依赖注入),例如:

// `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 )
}

如果通过api端点访问的“东西”不是业务/域实体。例如:假设端点是一个流程。例如:提取-因此这里没有CRUD。假设输入是一个文档,输出是JSON,显示文档中的第1行。那么它会是一个REST资源[使用名词](文档、集合、存储)或者REST控制器[使用动词]?@变量什么是“提取”?提取是一个端点-将文档作为输入,输出是JSON,显示文档的第1行。在这种情况下,什么是REST资源-是功能(提取)还是(输入)document?@变量,我将只使用
POST/services/extractor
。或者,如果有多个提取操作,例如
POST/services/extractor/first-line
。确定端点名称(资源)应该基于功能(extractor),而不是输入(文档)-这是一条规则吗?另外,您认为我可以只使用POST/extract第一行吗?