在 asp.net core 中,web api 中的路由(route)用于确定客户端请求的 url 与服务器端处理逻辑之间的映射关系。路由机制在 web api 的开发中非常重要,它帮助定义和管理不同请求路径如何触发特定的控制器和操作方法。
1. 路由概述
路由在 web api 中有两种主要的映射方式:
- 基于属性的路由(attribute routing):通过在控制器和操作方法上使用路由特性(例如
[route]
和[httpget]
)来配置路由规则。 - 约定路由(convention-based routing):基于约定的方式通过配置在
startup.cs
或program.cs
中的路由规则。
2. 基于属性的路由(attribute routing)
asp.net core web api 使用属性路由来定义 http 请求与控制器方法之间的映射。通过在控制器和操作方法上添加路由特性,可以直接控制 api 请求如何被路由到特定的控制器和方法。
2.1 控制器级别的路由
通过在控制器上使用 [route]
特性来定义路由前缀或基路径。所有控制器中的操作方法都会基于这个前缀来创建 url 路径。
[route("api/[controller]")] // 控制器的基础路由 public class productscontroller : controllerbase { // get api/products [httpget] public iactionresult getallproducts() { return ok(new { message = "获取所有产品" }); } // get api/products/{id} [httpget("{id}")] public iactionresult getproduct(int id) { return ok(new { message = $"获取产品 {id}" }); } }
[route("api/[controller]")]
会把控制器的路由前缀设置为api/products
(假设控制器名称是productscontroller
)。[httpget("{id}")]
为获取特定产品的方法指定一个带有参数id
的 url 路径。例如,get api/products/1
。
2.2 操作方法级别的路由
每个控制器方法可以通过单独的路由特性来指定其对应的 url 路径和 http 方法。
[route("api/[controller]")] public class productscontroller : controllerbase { [httpget] // get api/products public iactionresult getallproducts() { return ok(new { message = "获取所有产品" }); } [httpget("{id}")] // get api/products/{id} public iactionresult getproduct(int id) { return ok(new { message = $"获取产品 {id}" }); } [httppost] // post api/products public iactionresult createproduct([frombody] product product) { return createdataction(nameof(getproduct), new { id = product.id }, product); } }
[httpget("{id}")]
定义了一个带有id
参数的 get 请求,get api/products/1
将会触发该方法。[httppost]
用于处理 post 请求,post api/products
会调用createproduct
方法。
2.3 路由参数
- 常规参数:通过
{parametername}
来定义路由中的参数。 - 可选参数:使用
?
表示路由中的参数是可选的。 - 约束参数:可以对参数进行约束,例如只接受数字或字符串。
[route("api/products/{id:int}")] // 参数 id 必须是整数 public iactionresult getproduct(int id) { return ok(new { message = $"获取产品 {id}" }); } [route("api/products/{category?}")] // category 是可选参数 public iactionresult getproductsbycategory(string category) { return ok(new { message = $"获取 {category} 类别的产品" }); }
int
约束表示id
必须是整数。category?
表示category
是一个可选的查询参数。
3. 约定路由(convention-based routing)
asp.net core 也支持通过约定来定义路由,这种方式通常在 program.cs
或 startup.cs
文件中的 mapcontrollerroute
中配置。
3.1 默认路由配置
在 program.cs
或 startup.cs
中,你可以使用约定路由配置来定义 url 模式:
var builder = webapplication.createbuilder(args); builder.services.addcontrollers(); var app = builder.build(); // 约定路由配置 app.mapcontrollerroute( name: "default", pattern: "api/{controller}/{action}/{id?}"); app.run();
- 这种路由配置会生成类似
api/products/get/1
这样的 url。 {controller}
会被替换为控制器名称(不包括controller
后缀)。{action}
会被替换为方法名称。{id?}
是可选的参数。
3.2 匹配控制器和动作方法
约定路由的基本配置如下所示:
[apicontroller] [route("api/[controller]")] public class productscontroller : controllerbase { [httpget("{id?}")] // 默认情况下可以访问此路由 public iactionresult getproduct(int? id) { if (id.hasvalue) { return ok($"获取产品 id {id.value}"); } return ok("获取所有产品"); } [httppost] // 对应 post 请求 public iactionresult createproduct([frombody] product product) { return createdataction(nameof(getproduct), new { id = product.id }, product); } }
在这种配置下,get api/products/
和 get api/products/{id}
都能被映射到 getproduct
方法。
4. 路由的优先级
当多个路由规则可以匹配同一个请求时,asp.net core 会按照以下顺序匹配路由:
- 基于属性的路由:先匹配控制器和操作方法上的特性定义的路由。
- 约定路由:然后会匹配通过约定在
program.cs
或startup.cs
中配置的路由。
需要注意的是,如果存在多个路由规则都可以匹配同一个请求,asp.net core 会选择最具体的路由规则进行匹配。确保路由规则的优先级设置正确是非常重要的。
5. 路由的 http 方法
asp.net core 中的路由是通过 http 方法(get, post, put, delete 等)来区分的。例如,可以通过在控制器方法上使用 [httpget]
, [httppost]
, [httpput]
等特性来指定该方法响应的 http 请求类型。
[route("api/products")] public class productscontroller : controllerbase { [httpget] // get api/products public iactionresult getallproducts() { return ok(new { message = "获取所有产品" }); } [httppost] // post api/products public iactionresult createproduct([frombody] product product) { return createdataction(nameof(getproduct), new { id = product.id }, product); } }
6. 路由总结
- 基于属性的路由 提供了灵活的 url 定义方式,适合复杂的 api 路径。
- 约定路由 提供了基于控制器和动作方法的默认路由模式,简化了 url 的配置。
- 路由参数 可以通过路径、查询字符串或请求体传递,支持常规、可选、约束参数等形式。
- http 方法 的特性(如
[httpget]
,[httppost]
)用于区分不同类型的请求。
通过合理地使用路由特性,开发者可以实现对 api 路径、方法、请求类型等的精确控制,提升 web api 的可维护性和可扩展性。
到此这篇关于asp.net core 属性路由和约定路由的实现的文章就介绍到这了,更多相关asp.net core 属性路由和约定路由内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论