【问题标题】:How can my HTTP triggered Azure Function have the request's parameters directly passed to the Run method?我的 HTTP 触发 Azure 函数如何将请求的参数直接传递给 Run 方法?
【发布时间】:2019-02-13 01:39:46
【问题描述】:

我有以下由 HTTP 调用触发的 Azure 函数:

public static class MyAzureFunction
{
    [FunctionName("api/v1/resource/")]
    public static async Task Run([HttpTrigger(AuthorizationLevel.Function, "get")]HttpRequestMessage request, ILogger logger)
    {
        // Extract query string params from the request...
    } 
}

我希望将参数自动传递给 Run 方法,就像使用 ASP.NET Core Web API 一样,而不必从请求本身中提取它们并解析它们。

这是我想要得到的示例:

[FunctionName("api/v1/resource/{resourceId}")]
public static async Task Run([HttpTrigger(AuthorizationLevel.Function, "get")]HttpRequestMessage request, ILogger logger, int resourceId)
{
     // ...
} 

或者,在进行 POST 时:

[FunctionName("api/v1/resource/")]
public static async Task Run([HttpTrigger(AuthorizationLevel.Function, "post")]HttpRequestMessage request, ILogger logger, [FromBody] SomeEntityModel entityModel)
{
         // ...
}

【问题讨论】:

  • 快速浏览一下。 docs.microsoft.com/en-us/azure/azure-functions/… 它使用路由模板解决 GET,但在配置文件中。我仍在检查 POST
  • @Nkosi 哦,太好了!而且我以为我阅读了文档...只要您发布答案,我就会将其标记为已接受。
  • 重读后,似乎 POST 也可能被覆盖。检查更新以回答。

标签: c# azure-functions


【解决方案1】:

参考Azure Functions HTTP triggers and bindings: Customize the HTTP endpoint

对于 GET,您可以使用触发器上的 Route 属性属性为函数设置路由模板

定义路由模板,控制您的函数响应的请求 URL。如果没有提供默认值是<functionname>

这允许函数代码支持地址中的参数,如{resourceId}

您可以将任何 Web API 路由约束与您的参数一起使用。

例如

Route = "v1/resource/{resourceId:int}"

默认情况下,所有函数路由都以前缀api

以下使用带约束的参数

[FunctionName("MyFunctionName")]
public static async Task Run(
    [HttpTrigger(AuthorizationLevel.Function, "get", Route = "v1/resource/{resourceId:int}")]
    HttpRequestMessage request, 
    ILogger logger, 
    int resourceId) {
    // ...
}

到目前为止我还没有找到关于FromBody属性使用的详细信息,但是下面的引用似乎很有成果

对于 C# 和 F# 函数,您可以将触发器输入的类型声明为 HttpRequestMessage 或自定义类型。如果您选择HttpRequestMessage,您将获得对请求对象的完全访问权限。 对于自定义类型,运行时会尝试解析 JSON 请求正文以设置对象属性。

注意:强调我的

应该涵盖哪些

[FunctionName("MyPOSTFunction")]
public static async Task Run(
    [HttpTrigger(AuthorizationLevel.Function, "post", Route = "v1/resource/" )]
    SomeEntityModel entityModel, 
    ILogger logger) {
    // ...
}

【讨论】:

  • 最后一个例子的主要问题是,如果一个必需的 json 字段没有被解析,自动绑定不会抛出任何异常......程序只是将它登录并进一步工作并抛出异常它应该对根本原因返回错误的响应...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-11
  • 2018-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-28
  • 1970-01-01
相关资源
最近更新 更多