You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure APIM变量表达式中如何保留字面量大括号?

解决Azure APIM中WQL字面量大括号被误解析的问题

核心原因

APIM的rewrite-uri策略会将字符串中的单大括号{}识别为URI模板的变量占位符,即使这些大括号是WQL查询的字面量内容,也会被误解析为变量引用,导致报错。

解决方案

方法1:URL编码字面量大括号(推荐)

因为查询参数本身需要URL编码,直接对整个WQL字符串进行编码,既可以避免APIM解析大括号,也符合HTTP规范。

修改set-variable策略,使用Uri.EscapeDataString对查询字符串编码:

<set-variable name="wqlQuery" value="@(
    var inputDate = (string)context.Variables["inputDateString"];
    var rawQuery = $"PARAMETERS prompt_Date1 = '{inputDate}' SELECT worker, cf_CFESIINT5000_F {{workdayID, clockEventType, clockEventTime_NoTimeZone}} AS clockEvent FROM workersForHCMReporting (dataSourceFilter = allActiveWorkers) WHERE cf_CFESIINT5000_F is not empty";
    return Uri.EscapeDataString(rawQuery);
)" />

然后rewrite-uri直接拼接编码后的变量即可:

<rewrite-uri template="@(
    return $"/wql/v1/{{workday-api-tenant}}/data?query={context.Variables["wqlQuery"]}";
)" />

注:C#字符串中的{{}}会被转义为单大括号,确保原始WQL的结构正确,再通过编码将大括号转为%7B和%7D,APIM不会解析这些编码后的字符,Workday服务会自动解码识别。

方法2:使用APIM模板转义规则

APIM的URI模板中,用双大括号{{}}表示字面量的单大括号。可以在拼接URI时,将WQL中的单大括号替换为双大括号:

保持原set-variable不变,修改rewrite-uri策略:

<rewrite-uri template="@(
    var rawQuery = (string)context.Variables["wqlQuery"];
    // 将字面量大括号替换为APIM模板的转义格式
    var escapedQuery = rawQuery.Replace("{", "{{").Replace("}", "}}");
    return $"/wql/v1/{{workday-api-tenant}}/data?query={escapedQuery}";
)" />

APIM解析模板时,会把{{转换为{,}}转换为},同时保留{{workday-api-tenant}}作为变量引用的功能。

内容的提问来源于stack exchange,提问作者dtryan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.18 11:06:11