
在 ASP.NET Core 中,Web API 中的路由(Route)用于确定客户端请求的 URL 与服务器端处理逻辑之间的映射关系。路由机制在 Web API 的开发中非常重要,它帮助定义和管理不同请求路径如何触发特定的控制器和操作方法。
路由在 Web API 中有两种主要的映射方式:
[Route]
和 [HttpGet]
)来配置路由规则。Startup.cs
或 Program.cs
中的路由规则。ASP.NET Core Web API 使用属性路由来定义 HTTP 请求与控制器方法之间的映射。通过在控制器和操作方法上添加路由特性,可以直接控制 API 请求如何被路由到特定的控制器和方法。
通过在控制器上使用 [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
。每个控制器方法可以通过单独的路由特性来指定其对应的 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
方法。{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
是一个可选的查询参数。ASP.NET Core 也支持通过约定来定义路由,这种方式通常在 Program.cs
或 Startup.cs
文件中的 MapControllerRoute
中配置。
在 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?}
是可选的参数。约定路由的基本配置如下所示:
[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
方法。
当多个路由规则可以匹配同一个请求时,ASP.NET Core 会按照以下顺序匹配路由:
Program.cs
或 Startup.cs
中配置的路由。需要注意的是,如果存在多个路由规则都可以匹配同一个请求,ASP.NET Core 会选择最具体的路由规则进行匹配。确保路由规则的优先级设置正确是非常重要的。
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); } }
[HttpGet]
, [HttpPost]
)用于区分不同类型的请求。通过合理地使用路由特性,开发者可以实现对 API 路径、方法、请求类型等的精确控制,提升 Web API 的可维护性和可扩展性。
到此这篇关于asp.net core 属性路由和约定路由的实现的文章就介绍到这了,更多相关asp.net core 属性路由和约定路由内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!