【问题标题】:How to specify a query parameter in a custom HTTP route of an Azure Function?如何在 Azure Function 的自定义 HTTP 路由中指定查询参数?
【发布时间】:2019-02-11 18:48:07
【问题描述】:

我有一个 Azure 函数,我想设置一个自定义 HTTP 端点。按照这个 SO question 的答案,我最终得到了这样的结果:

[FunctionName("DoSomething")]
public static async Task<IActionResult> Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", Route = "v1/tenants/{tenantId}/locations/{locationId}/products?manufacturer={manufacturer}")]
                HttpRequest request, ILogger logger, string tenantId, string locationId, string manufacturer)
{
        // 
}

但是,该路由不被 Webjob 接受:

"v1/tenants/{tenantId}/locations/{locationId}/products?manufacturer={manufacturer}"

原因是因为问号'?':

创建名为“DoSomething”的路由时出错,并且 模板 'api/v1/tenants/{tenantId}/locations/{locationId}/products?manufacturer={manufacturer}'。 文字部分 'products?manufacturer=' 无效。文字部分 不能包含“?”特点。参数名称:routeTemplate 文字部分 'products?manufacturer=' 无效。文字部分 不能包含“?”字符。

问题

如何在 Azure Function 的自定义 HTTP 端点中指定查询参数?

【问题讨论】:

  • 不应该是:v1/tenants/{tenantId}/location/{locationId}/products/{productId}?
  • 这不是错字:) /products?product={productId}。我想查询指定位置的潜在产品 ID,并且我想让它看起来像查询中的过滤器。我将更新问题以减少混乱...
  • 不,我的意思是你不应该那样做吗?这是常规方法。
  • 哦...你是说我永远不应该在自定义 HTTP 端点中使用查询参数并且它应该始终是 URL 的一部分?
  • 不,你可以双向,查询参数或指定它

标签: c# azure azure-functions


【解决方案1】:

恐怕不能将查询参数放在Route中。

Microsoft.AspNetCore.Routing:文字部分 'products?manufacturer=' 无效。文字部分不能包含“?”字符。

这是 ASP.NET Routing 的内置限制,Azure Function 使用它来构建 Http 触发器的路由。

允许我将值作为 Run 的方法参数之一获取,而不是戳到 HttpRequest 实例

如果是你想在路由中加入查询参数的原因,我建议你在方法签名中添加IDictionary&lt;string, string&gt; query,并使用query["manufacturer"]访问函数代码中的参数。不过老实说跟request.Query["manufacturer"]差不多。

或者您可能必须按照建议,将查询参数转换为路由,如products/{productId}

【讨论】:

    【解决方案2】:

    这是我使用查询参数的函数示例:

    public static async Task<HttpResponseMessage> Run( HttpRequestMessage req, TraceWriter log, ExecutionContext context )
    {
        string data = await req.Content.ReadAsStringAsync();
        dynamic parsed = JsonConvert.DeserializeObject(data);
        if (parsed == null)
        {
            parsed = req.GetQueryNameValuePairs().ToDictionary(kv => kv.Key, kv=> kv.Value, StringComparer.OrdinalIgnoreCase);
        }
    
        xxx
    }
    

    然后您只需将请求参数名称指定为 req,我认为。如果你想走 Crowcoder 建议的路线,你只需在设置中指定你的路径(integrate 标签):

    如您所见,我没有定义路线,它可以正常工作。我怀疑您不需要在路由中定义查询参数。

    【讨论】:

    • 我正在寻找一种解决方案,该解决方案允许我将值作为 Run 的方法参数之一获取,而不是戳到 HttpRequest 实例。
    • 不确定,但我不认为你可以定义查询参数,你总是可以做products/{productId},这很有意义,tbh
    猜你喜欢
    • 2022-06-20
    • 1970-01-01
    • 1970-01-01
    • 2022-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-22
    • 2020-01-06
    相关资源
    最近更新 更多