实用技巧

关注公众号 jb51net

关闭
首页 > 网络编程 > ASP.NET > 实用技巧 > asp.net core 属性路由和约定路由

asp.net core 属性路由和约定路由的实现

作者:Libby博仙

ASP.NET Core中的WebAPI路由用于映射客户端请求的URL到服务器端的控制器和操作方法,路由分为基于属性的路由和约定路由两种方式,本文就来介绍一下,感兴趣的可以了解一下

在 ASP.NET Core 中,Web API 中的路由(Route)用于确定客户端请求的 URL 与服务器端处理逻辑之间的映射关系。路由机制在 Web API 的开发中非常重要,它帮助定义和管理不同请求路径如何触发特定的控制器和操作方法。

1. 路由概述

路由在 Web API 中有两种主要的映射方式:

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}" });
    }
}

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); 
    } 
}

2.3 路由参数

[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} 类别的产品" }); 
}

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();

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 会按照以下顺序匹配路由:

需要注意的是,如果存在多个路由规则都可以匹配同一个请求,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. 路由总结

通过合理地使用路由特性,开发者可以实现对 API 路径、方法、请求类型等的精确控制,提升 Web API 的可维护性和可扩展性。

到此这篇关于asp.net core 属性路由和约定路由的实现的文章就介绍到这了,更多相关asp.net core 属性路由和约定路由内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文