我正在浏览ASP.Net网站上的ASP.Net Web API getting started tutorial。
我编写了这个例子,我理解了我所做的一切。我对C#非常有经验,但之前从未接触过任何ASP.Net。
在示例中,我们创建了一个Product
类和一个ProductsController : ApiController
类。这一切都很好。
当我导航到/api/products
时,会列出定义的产品,当我导航到/api/products/id
时,会列出带有该ID的产品。
这一切从何而来?该类名为Product
,一个名为ProductsController
,因此我不知道“product s ”的来源。此外,我尝试将GetAllProducts()
和GetProduct(int)
重命名为随机内容,仍然有效。
那么这里发生了什么?作为来自桌面C#开发的人,我无法看到这些事物之间的连接在哪里,我无法看到如何制作我自己的API,如/api/foo/bar
,它可以执行任意操作。
答案 0 :(得分:1)
因为命名转换会为您创建路径。您的ProductsController
课程会提供/products
部分,GetAllProducts
会提供HTTP方法GET
,因此请求/api/products
会触及相应的方法。即使您将GetAllProducts
重命名为Get123
,它仍然有效,因为web-api只关注Get
关键字并且没有参数。
GetProduct(int id)
是一样的,唯一的区别是它有一个参数。这就是为什么它被/api/products/1
击中的原因。 web-api选择它作为请求URL的最佳匹配(通过反射)。同样,如果您将其重命名为Get123(int id)
,它仍然有效。
以上是默认的命名转换路由。您始终可以通过RouteAttribute修改它们。
答案 1 :(得分:1)
WebAPI支持一组预定义的命名约定,以确定将请求路由到的正确控制器。
首先,采用默认路由配置:
routes.MapHttpRoute(
name: "API Default",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
WebAPI将执行以下步骤以尝试确定要执行的操作:
Controller
添加到{controller}
变量的值(即将products
转换为ProductsController
)。Get...
开头的操作,例如GetProduct
或GetAllProducts
。此约定仅适用于GET,POST,PUT和DELETE方法。{id}
)将映射到操作参数。您可以在此处找到更多信息:Routing in ASP.NET Web API