asp.net core 属性路由和约定路由

在 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.csStartup.cs 文件中的 MapControllerRoute 中配置。

3.1 默认路由配置

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

  1. 基于属性的路由:先匹配控制器和操作方法上的特性定义的路由。
  2. 约定路由:然后会匹配通过约定在 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 的可维护性和可扩展性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/503144.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

西门子200smart存储卡作用

最近维修设备时,遇到一个问题,设备PLC是200smart SR20,PLC程序需要修改某个程序段,由于手里没有源程序,联系厂家后,厂家发了一段程序,后缀是.s7s。通过查询官网资料,其中S7_JOB.S7S为脚本任务&a…

QT上实现SVM进行数据分类

针对不了解SVM的原理的同学强推下面这个课程: 6.机器学习课程(六)支持向量机(线性模型)问题_哔哩哔哩_bilibili 一、QT实现SVM的方法 1.调用SVM的C语言库:麻烦,要专门去找库,cmak…

【C++】字符串与字符数|组操作详解:strcpy 和 strcat 的使用与解析

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯一、字符串数组的基本操作💯二、strcpy 的用法详解1. strcpy 的功能与原型2. 使用示例与代码演示3. 注意事项4. 扩展:为什么不能直接用 &#xff1f…

GWAS数据和软件下载

这部分主要是数据获取,以及软件配置方法。 一、配套数据和代码 数据和代码目前在不断的更新,最新的教程可以私信,我通过后手动发送最新版的pdf和数据代码。发送的压缩包,有电子版的pdf和数据下载链接,里面是最新的百度网盘的地址,下载到本地即可。然后根据pdf教程,结合配套的…

Vue笔记-001-声明式渲染

https://cn.vuejs.org/tutorial/#step-2https://cn.vuejs.org/tutorial/#step-2 Vue 单文件组件 (Single-File Component,缩写为 SFC) 单文件组件是一种可复用的代码组织形式,它将从属于同一个组件的 HTML、CSS 和 JavaScript 封装在使用 .vue 后缀的文件…

Scala_【5】函数式编程

第五章 函数式编程函数和方法的区别函数声明函数参数可变参数参数默认值 函数至简原则匿名函数高阶函数函数作为值传递函数作为参数传递函数作为返回值 函数闭包&柯里化函数递归控制抽象惰性函数友情链接 函数式编程 面向对象编程 解决问题时,分解对象&#xff…

(六)优化 ChatGPT 交互:任务式 Prompt 的力量

📢📢📢 大家好,我是云楼Yunlord,CSDN博客之星人工智能领域前三名,多年人工智能学习工作经验,一位兴趣稀奇古怪的【人工智能领域博主】!!!😜&#…

HarmonyOS-面试资料

1. HarmonyOS-面试资料 1.1. HarmonyOS 优点、特点 1.1.1. 优点 (1)在国家方面,是国产的系统,受国家支持不会有限制的情况。   (2)设备互连18N(1:手机 8:平板、PC、vr设备、可穿戴设备、智慧…

R语言基础| 中级绘图

写在前面 前面第六章的图形主要是展示单分类变量或连续型变量的分布情况。本章主要研究二元变量或多元变量关系的可视化。更多教程可参考: R语言基础学习手册 图片集锦: 11.1 散点图 1)添加最佳拟合曲线的散点图: 绘制汽车重…

神经网络第一课

目录 背景知识生物神经元人工神经元模型神经网络训练神经网络结论背景知识 神经网络是一种人工智能模型,其主要受生物神经系统启发,重现了大脑中神经元之间相互连接的方式。 神经网络已在很多领域中取得显著成就,如图像识别、自然语言处理和语音识别等。 生物神经元 神经…

Docker:安装 XXL-JOB 分布式调度任务的技术指南

1、简述 XXL-JOB 是一个分布式任务调度平台,提供简单易用的任务调度功能。它支持分布式调度、失败重试、任务监控和报警等功能。XXL-JOB 采用了服务端与执行器的架构,任务调度在服务端进行,而任务的实际执行则由各个执行器完成。 XXL-JOB 的…

Git revert回滚

回退中间的某次提交(此操作在预生产分支上比较常见),建议此方式使用命令进行操作(做好注释,方便后续上线可以找到这个操作) Git操作: 命令:revert -n 版本号 1:git re…

新年到了!使用Python创建一个简易的接金元宝游戏

引言 在本教程中,我们将一起学习如何使用Python编程语言和Pygame库来创建一个简单的休闲游戏——“接金元宝”。 准备工作 首先,确保你的计算机上已经安装了Python(推荐3.6以上版本)和Pygame库。如果还没有安装Pygame&#xff0…

GoF23种设计模式 简介

文章目录 面向对象(OO)设计原则(7)单一职责原则开闭原则里氏代换原则依赖倒转原则接口隔离原则合成复用原则迪米特法则 创建型模式 (5)工厂方法模式 (类模式,其余都是对象模式)抽象工厂模式建造…

【数电尾灯设计】2022-8-16

缘由数电尾灯设计问题,求解答--CSDN问答 从题目可以列出 000 100 010 111-----------4进制 000 100 010 110 001 101 011 111-----------8进制 由列出可知用16进制芯片的3个引脚可以获得8进制推导出4进制从而可用逻辑处理为4进制实现尾灯功能。之上第一步实现了尾灯…

在线机考|2024华为实习秋招春招编程题(最新)——第3题_个性化歌单推荐系统_300分(十一)

题目内容 假设你是音乐服务的开发者,为了提高用户体验需要解决推荐歌单的同质化问题,保证推荐给用户的所有歌单不包含相同歌曲的。给定一个包含N个歌单和M条歌单重复记录,每个歌单用一个从1到N的整数编号,歌单重复记录包含两个歌单的ID,表示两个歌单有相同的歌曲。 你的任…

Ant Design Pro写项目的总结经验(react)

配置代理(proxy) 在config文件夹下面的config.ts里面配置修改 修改前:修改后: 修改账号框以及登录接口以及登录返回的code 由于它的账号框是username,但是我们接口请求要填写的是account,因此可以全局搜索进行替换…

安卓14无法安装应用解决历程

客户手机基本情况: 安卓14,对应的 targetSdkVersion 34 前天遇到了安卓14适配问题,客户发来的截图是这样的 描述:无法安装我们公司的B应用。 型号:三星google美版 解决步骤: 1、寻找其他安卓14手机测试…

51单片机(二)中断系统与外部中断实验

中断即单片机因为某些原因E暂定现在的工作P0,转去做其他的工作P1,完了之后继续之前的事P0,其他工作P1就是中断程序,原因E就是中断事件,原因由外部发生,程序不能预测到的是硬中断,可以由程度触发…

66.基于SpringBoot + Vue实现的前后端分离-律师事务所案件管理系统(项目 + 论文)

项目介绍 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装律师事务所案件管理系统软件来发挥其高效地信息处理的作用…