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

如何通过API Management Policy Expressions生成可变长度XML元素?

能否通过API管理策略表达式将可变长度数组输出为一组XML元素?

我正在使用策略片段和<validate-jwt>策略,大部分场景仅需单个<audience>元素,但存在需配置多个受众的边缘情况。由于<audiences>不具备<claim>那样的separator属性,我希望避免为支持2-3个受众而复制策略片段。

我尝试实现类似Razor风格的foreach来构建XML元素,但出现验证错误:Error in element 'validate-jwt' on line 17, column 2: The element 'audiences' cannot contain text. List of possible elements expected: 'audience'.。目前已实现一种可行但不够简洁的方案(如下POC示例)。

不够简洁的POC示例

<set-variable name="apiAudiences" value="api://abc api://def" />
<validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Unauthorized">
    <audiences>
        <audience>@((((string)context.Variables["apiAudiences"]) + " Invalid Invalid Invalid Invalid Invalid").Split(' ')[0])</audience>
        <audience>@((((string)context.Variables["apiAudiences"]) + " Invalid Invalid Invalid Invalid Invalid").Split(' ')[1])</audience>
        <audience>@((((string)context.Variables["apiAudiences"]) + " Invalid Invalid Invalid Invalid Invalid").Split(' ')[2])</audience>
        <audience>@((((string)context.Variables["apiAudiences"]) + " Invalid Invalid Invalid Invalid Invalid").Split(' ')[3])</audience>
        <audience>@((((string)context.Variables["apiAudiences"]) + " Invalid Invalid Invalid Invalid Invalid").Split(' ')[4])</audience>
    </audiences>
</validate-jwt>

虽然可以用choose策略改写,但会增加片段级代码重复,且如果<validate-jwt>的多个属性都需要可变数量结果,该方案扩展性不佳。

策略片段示例 - ReusableJwtValidation

<fragment>
    <validate-jwt header-name="Authorization" failed-validation-httpcode="401" failed-validation-error-message="Unauthorized. Access token is missing or invalid.">
        <openid-config url="https://login.microsoftonline.com/xxxxxxx/.well-known/openid-configuration" />
        <audiences>
            <audience>@((((string)context.Variables["apiAudiences"]) + " Invalid1 Invalid2 Invalid3").Trim().Split(' ')[0])</audience>
            <audience>@((((string)context.Variables["apiAudiences"]) + " Invalid1 Invalid2 Invalid3").Trim().Split(' ')[1])</audience>
            <audience>@((((string)context.Variables["apiAudiences"]) + " Invalid1 Invalid2 Invalid3").Trim().Split(' ')[2])</audience>
        </audiences>
        <required-claims>
            <claim name="roles" match="any" separator=" ">
                <value>@((string)context.Variables["apiRoles"])</value>
            </claim>
        </required-claims>
    </validate-jwt>
    <set-header name="Authorization" exists-action="delete" />
</fragment>

在API级策略中使用

<policies>
    <inbound>
        <base />
        <set-variable name="apiAudiences" value="api://dummyGuid1 api://dummyGuid2" />
        <set-variable name="apiRoles" value="dev.DummyAPI.Read dev.DummyAPI.ReadWrite" />
        <include-fragment fragment-id="ReusableJwtValidation" />
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies> 

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 12:35:55