c# - 如何使用正则表达式匹配路由部分中的部分url?WebAPI .NET 核心 2.2
问题描述
我现在正在尝试编写一个 WebApi 应用程序。在路由部分(控制器)中,我想使用正则表达式来匹配部分 url。但是,似乎"/"
不能很好地识别。
例如,api url 是"api/books/science/list"
. 我想得到"api/books/science"
和"list"
。我尝试了以下正则表达式[HttpGet("{url=.*}/list")]
。但似乎正则表达式不起作用。".*"
无法匹配"\"
。
该 api 的设计类似于"api/*{path}/list"
. 因为*{path}
,它可能有多个结构,例如books/science
或books/art/Asia'
。我想使用正则表达式来匹配它们,然后,它们可以用于以下操作。
实际上,我尝试了另一种方法来获取 url [HttpGet("{**url}")]
。但我认为这不是一个很好的解决方案,因为我需要解析 url。
解决方案
通过:regex()
参数支持正则表达式。有关信息,请参阅有关Regex的ASP.NET Core 文档中的路由,例如路由中间件。
尝试:[HttpGet("{url:regex(.*)}/list")]
正如您指出的那样,这不起作用,因为它适用于路由 url 的标记化值。
一种替代方法是在路由中使用包罗万象(在 Startup.cs 中):
routes.MapRoute(
name: "therest",
template: "/{**url}",
defaults: new { controller = "Home", action="Index"} // Send to /home/index
);
或者,如果您知道路径元素的数量有限,您可以简单地将它们全部包含在内:
[HttpGet("/{url1}")]
[HttpGet("/{url1}/{url2}")]
[HttpGet("/{url1}/{url2}/{url3}")]
[HttpGet("/{url1}/{url2}/{url3}/{url4}")]
public IActionResult Test(string url1 = null, string url2 = null, string url3 = null, string url4 = null)
{
var url = string.Join("/", url1, url2, url3, url4);
//... return View();
}
我认为另一种选择是在中间件中编写一些额外的路由代码。
推荐阅读
- python - sympy - 积分的奇怪行为。解决方案中包含大量数字的数字
- angular - 在角度 11 中安装 ng-bootstrap 时出错
- python - 如何在 GPU 上运行 datawig?
- javascript - 如何将服务器端 JSON 传递/导入到 vue 应用程序?
- python - HTML 到 PDF 还保留了 Django 中的 CSS 和引导样式
- php - Codeigniter 3 验证码助手 create_captcha 返回 bool
- powershell - 从文件夹中提取名称并使用它 powershell
- python - Pytorch 批量逐行应用函数
- ada - GNAT CE 2020 无法识别 -gnatt 开关
- c - 引用传递也可以称为指针传递吗?