Azure Functions 2.0 HTTP 路由选项
Azure Functions 2.0 HTTP 路由选项
什么是路由
路由指的是应用程序如何响应客户端对特定终结点地址和特定 HTTP 请求方法(GET
、POST
等)的请求。 在 Azure Functions 的上下文中,路由定义了哪个函数将响应 HTTP 请求。
Azure Functions 默认路由
为了演示各种路由选项,我将使用默认的 Azure Functions 2.0 (.NET Core) HTTP 触发器模板,该模板如下所示(在撰写本文时)。
[FunctionName("NameFunction")]
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = null)] HttpRequest req,
ILogger log)
{
log.LogInformation("C# HTTP trigger function processed a request.");
string name = req.Query["name"];
string requestBody = await new StreamReader(req.Body).ReadToEndAsync();
dynamic data = JsonConvert.DeserializeObject(requestBody);
name = name ?? data?.name;
return name != null
? (ActionResult)new OkObjectResult($"Hello, {name}")
: new BadRequestObjectResult("Please pass a name on the query string or in the request body");
}
通过在本地运行它,您可以看到调用此函数的默认 URL 是https://:7071/api/NameFunction。 此 URL 由 API 的路由前缀,然后是您的函数名称(在本例中为“NameFunction
”)组成。
运行该应用会公开默认 URL。
在浏览器中导航到此 URL,并提供带有您姓名的参数,将产生以下结果
使用 host.json 更改路由前缀
要更改应用程序的 /api/ 默认路由,需要修改 host.json 文件。 这是一个包含全局配置选项的文件,这些选项会影响给定函数应用程序的所有函数。
要修改路由前缀,请修改 host.json 文件,使其看起来像这样
{
"version": "2.0",
"extensions": {
"http": {
"routePrefix": "Name"
}
}
}
这将把 https://:7071/api/NameFunction 变成 https://:7071/Name/NameFunction。
为了完全删除路由前缀,请修改 host.json 的 routePrefix
部分以匹配以下内容
{
"version": "2.0",
"extensions": {
"http": {
"routePrefix": ""
}
}
}
这将把 https://:7071/api/NameFunction 变成 https://:7071/NameFunction。
删除路由前缀后,我仍然可以通过从 URL 中删除它来像往常一样调用 API。
在函数头中定义路由
还可以通过修改函数头中的 HttpTrigger
属性来定义路由,默认情况下,此属性设置为 null
。 将此值更改为“GetName
”会将 URL 更改为 https://:7071/api/GetName。
[FunctionName("NameFunction")]
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = "GetName")] HttpRequest req,
ILogger log)
{ ...
也可以将路由更改为空 string
。 这会将 URL 更改为 https://:7071/api/。
将参数添加到函数路由
要将参数添加到函数的路由,您需要在 HttpTrigger
属性的 route 属性中添加花括号中的参数名称,此外还需要将其添加到方法参数中。
为了演示这一点,请重构默认的 HTTP 触发器代码以匹配以下内容
[FunctionName("NameFunction")]
public static IActionResult Run(
[HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = "GetName/{name}")] HttpRequest req,
string name,
ILogger log)
{
log.LogInformation("C# HTTP trigger function processed a request.");
return new OkObjectResult($"Hello, {name}");
}
这将把 URL 更改为以下 https://:7071/api/GetName/{name}。
现在,我不再通过 URL 参数提供名称,而是可以使用路由参数来提供名称。
如果我们不指定路由参数,则用户将收到 404 错误,因为找不到匹配的路由。
使路由参数可选
如我的前一个示例所示,使用路由提供函数参数是使函数 URL 更易于阅读和更易于使用的好方法。 但是,我们已经重构了我们的代码,以删除友好的消息,以提醒用户他们忘记提供 name 参数。
为了将此消息添加回我们的函数,我们需要使我们的路由参数成为可选参数。 这可以通过在路由定义中的参数名称和函数头参数中的类型(如果它是为了使其可为空的值类型)中添加 ?
来实现。
将代码重构为以下内容
[FunctionName("NameFunction")]
public static IActionResult Run(
[HttpTrigger(AuthorizationLevel.Function, "get", "post", Route = "GetName/{name?}")]
HttpRequest req,
string name,
ILogger log)
{
log.LogInformation("C# HTTP trigger function processed a request.");
return name != null
? (ActionResult)new OkObjectResult($"Hello, {name}")
: new BadRequestObjectResult("Please pass a name as a route parameter");
}
现在,通过将我们的姓名指定为 URL 参数,我们可以看到我们期望的问候消息。
通过删除名称,该参数默认为 null
,并返回我们的提醒消息。
总结
希望这可以作为有关如何在 Azure Functions 上配置路由的相当全面的指南。 如果您有任何问题,请通过 Twitter (@_TomLing) 或在下面的评论部分告诉我。
历史
- 2019年1月25日:初始版本