65.9K
CodeProject 正在变化。 阅读更多。
Home

Azure Functions 2.0 HTTP 路由选项

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.90/5 (7投票s)

2019年1月25日

CPOL

3分钟阅读

viewsIcon

37373

Azure Functions 2.0 HTTP 路由选项

什么是路由

路由指的是应用程序如何响应客户端对特定终结点地址和特定 HTTP 请求方法(GETPOST 等)的请求。 在 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”)组成。

Default Routing

运行该应用会公开默认 URL。

在浏览器中导航到此 URL,并提供带有您姓名的参数,将产生以下结果

Default Route Browser Result

使用 host.json 更改路由前缀

要更改应用程序的 /api/ 默认路由,需要修改 host.json 文件。 这是一个包含全局配置选项的文件,这些选项会影响给定函数应用程序的所有函数。

要修改路由前缀,请修改 host.json 文件,使其看起来像这样

{
  "version": "2.0",
  "extensions": {
    "http": {
      "routePrefix": "Name"

    }
  }
}

这将把 https://:7071/api/NameFunction 变成 https://:7071/Name/NameFunction

为了完全删除路由前缀,请修改 host.jsonroutePrefix 部分以匹配以下内容

{
  "version": "2.0",
  "extensions": {
    "http": {
      "routePrefix": ""

    }
  }
}

这将把 https://:7071/api/NameFunction 变成 https://:7071/NameFunction

删除路由前缀后,我仍然可以通过从 URL 中删除它来像往常一样调用 API。

Remove Route Prefix Browser Result

在函数头中定义路由

还可以通过修改函数头中的 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 参数提供名称,而是可以使用路由参数来提供名称。

Route Parameter

如果我们不指定路由参数,则用户将收到 404 错误,因为找不到匹配的路由。

Route Parameter 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 参数,我们可以看到我们期望的问候消息。

Route Parameter

通过删除名称,该参数默认为 null,并返回我们的提醒消息。

Route Parameter Not Found

总结

希望这可以作为有关如何在 Azure Functions 上配置路由的相当全面的指南。 如果您有任何问题,请通过 Twitter (@_TomLing) 或在下面的评论部分告诉我。

历史

  • 2019年1月25日:初始版本
© . All rights reserved.