我已经定义了4种尝试将regex路由用于我的azure函数的方法,但都无效。
我做错了什么?
public class ServerlessApi
{
[FunctionName("Proxy")]
public async Task<IActionResult> Run([HttpTrigger(AuthorizationLevel.Anonymous, Route = "{test:regex(^\\/(subscriptions\\/[^\\/]+\\/)?(resourcegroups\\/[^\\/]+\\/)?providers\\/(Storage\\.IO))}")]HttpRequest req) =>
new ProxyActionResult<FunctionHostStartup>();
[FunctionName("Proxy1")]
public async Task<IActionResult> Run1([HttpTrigger(AuthorizationLevel.Anonymous, Route = "{test:regex(^/(subscriptions/[^/]+/)?(resourcegroups/[^/]+/)?providers/(Storage\\.IO))}")]HttpRequest req) =>
new ProxyActionResult<FunctionHostStartup>();
[FunctionName("Proxy2")]
public async Task<IActionResult> Run2(
[HttpTrigger(AuthorizationLevel.Anonymous, Route = "{path:regex(^/providers/Storage\\.IO)}")] HttpRequest req)
=> new ProxyActionResult<FunctionHostStartup>();
[FunctionName("Proxy3")]
public async Task<IActionResult> Run3([HttpTrigger(AuthorizationLevel.Anonymous, Route = "{test:regex(^\\/providers\\/(Storage\\.IO))}")]HttpRequest req) =>
new ProxyActionResult<FunctionHostStartup>();
}
我曾经使用nginx并具有以下匹配:
$"~* ^/(subscriptions/[^/]+/)?(resourcegroups/[^/]+/)?providers/(Storage.IO)"
试图在我的azure函数上做同样的事情。
答案 0 :(得分:0)
好的,我想现在可以为您提供一些帮助。要点是,您不应在此处使用正则表达式。您应该在这里使用route parameters。根据{{3}},您应该能够使用与Web API完全相同的语法。
这里的问题是URL可能会有所不同,我们需要考虑一些情况。
它将与/ subscriptions / {id} / resourcegroups / {id} / providers / {id}匹配
然后像这样定义它
[FunctionName("Function1")]
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = "f1/subscriptions/{subid:int?}/resourcegroups/{resid:int?}/providers/{proid:int?}")] HttpRequest req,
ILogger log, int? subid, int? resid, int? proid)
{
log.LogInformation("C# HTTP trigger function processed a request.");
return new OkObjectResult($"Got s {subid}, r {resid}, p {proid}");
}
当然,您应该使用对您有意义的类型和约束。这个问题是您确实应该指定所有参数http://localhost:7071/api/f1/subscriptions/1/resourcegroups/0/providers/4
。您将无法像http://localhost:7071/api/f1/providers/4
一样写smt。因此,我将为此和其他所有情况创建一个函数,以另一种类/方法提取通用逻辑:
[FunctionName("Function2")]
public static async Task<IActionResult> Run2(
[HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = "f2/providers/{proid:int?}")] HttpRequest req,
ILogger log, int? proid)
{
log.LogInformation("C# HTTP trigger function processed a request.");
return new OkObjectResult($"Got p {proid}");
}
另一种可能性是使用this,将整个路由与变量匹配,然后使用正则表达式对其进行解析。