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
相关产品推荐
相关产品推荐

