【问题标题】:How to use regular expression to match part of url in route part? WebAPI .NET core 2.2如何使用正则表达式匹配路由部分中的部分url? WebAPI .NET 核心 2.2
【发布时间】:2019-04-22 06:03:38
【问题描述】:

我现在正在尝试编写一个 WebApi 应用程序。在路由部分(控制器)中,我想使用正则表达式来匹配部分 url。但是,"/" 好像不能很好识别。

例如,api url 是"api/books/science/list"。我想得到"api/books/science""list"。我尝试了以下正则表达式[HttpGet("{url=.*}/list")]。但似乎正则表达式不起作用。 ".*" 无法匹配 "\"

api 的设计类似于"api/*{path}/list"。对于*{path},它可能有多个结构,例如books/sciencebooks/art/Asia'。我想用正则表达式来匹配它们,然后,它们可以用于以下操作。

其实我已经尝试过另一种方法来获取url[HttpGet("{**url}")]。但我认为这不是一个很好的解决方案,因为我需要解析 url。

【问题讨论】:

标签: c# asp.net-core-webapi


【解决方案1】:

通过:regex() 参数支持正则表达式。有关信息,请参阅 Regex 上的 ASP.NET Core 文档中的路由,例如 Routing Middleware

试试:[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();
}

我认为另一种方法是在中间件中编写一些额外的路由代码。

【讨论】:

  • 感谢您的回复。 [HttpGet("{url:regex(.*)}/list")] 无法匹配 "/"。我的意思是对于示例books/list,是的,正则表达式可以匹配,"url" 可以得到值"books"。但是,如果示例是books/science/list,则正则表达式不起作用。
  • 我设置了这些项目并尝试过,看来你是对的。据我所知,这是由于路由值的标记化。我找不到任何绕过它的简单示例,因此添加了一些关于如何解决它的建议。
猜你喜欢
  • 2018-03-14
  • 2020-01-02
  • 1970-01-01
  • 2011-09-04
  • 2011-06-13
  • 1970-01-01
  • 2017-11-29
  • 2017-06-23
  • 1970-01-01
相关资源
最近更新 更多