API 管理 - 使设置查询参数以不区分大小写的方式工作

问题描述 投票:0回答:1

我们在 API Manager 中配置了一个 API,其中包含一些产品和策略。其中一项策略试图确保某些查询参数始终设置为特定值。

<set-query-parameter name="myParameter" exists-action="override">
<value>myFixedValue</value>
</set-query-parameter>

这工作得很好,直到有人添加具有不同大小写的相同参数,例如。

MyParameter
mYpAraMeTeR
,在这种情况下,设置查询参数策略将被忽略,因为它区分大小写。

有没有办法确保以不区分大小写的方式正确应用此策略?

经过一番搜索,我找到了政策

validate-parameters
,我希望它能有所帮助,但到目前为止我还没有找到神奇的属性组合。

<validate-parameters specified-parameter-action="ignore" unspecified-parameter-action="prevent" errors-variable-name="validationErrors">
    <headers specified-parameter-action="ignore" unspecified-parameter-action="ignore"/>
    <query specified-parameter-action="ignore" unspecified-parameter-action="prevent">
        <parameter name="myParameter" action="ignore" />
    </query>
    <path specified-parameter-action="ignore"/>
</validate-parameters>

我希望这只会传递提供的所有标头和路径,但将允许的查询参数限制为仅

myParameter

希望有更多 APIM 知识的人可以帮助我:)

azure azure-api-management
1个回答
0
投票

看起来

validate-parameters
也区分大小写。

正确的政策定义是-

<policies>
    <inbound>
        <base />
        <validate-parameters specified-parameter-action="ignore" unspecified-parameter-action="prevent" errors-variable-name="requestParametersValidation">
            <headers specified-parameter-action="ignore" unspecified-parameter-action="ignore" />
            <query specified-parameter-action="ignore" unspecified-parameter-action="prevent">
                <parameter name="myParameter" action="ignore" />
            </query>
        </validate-parameters>
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>

但是,如果您传递

myParameter
参数以外的任何其他值,则会出现错误。它不适用于
myParameter
的大小写值。

enter image description here enter image description here

因此,或者我使用以下策略,该策略仅适用于

myParameter
,但不适用于
myParameter
参数的任何其他组合。

<policies>
    <inbound>
        <base />
        <choose>
            <when condition="@(context.Request.Url.Query.TryGetValue("myParameter", out var value) && value.Any(v => string.Equals(v, "myFixedValue", StringComparison.OrdinalIgnoreCase)))" />
            <otherwise>
                <return-response>
                    <set-status code="400" reason="Bad Request" />
                    <set-header name="Content-Type" exists-action="override">
                        <value>text/plain</value>
                    </set-header>
                    <set-body>@("Only the 'myParameter' query parameter is allowed.")</set-body>
                </return-response>
            </otherwise>
        </choose>
    </inbound>
    <backend>
        <base />
    </backend>
    <outbound>
        <base />
    </outbound>
    <on-error>
        <base />
    </on-error>
</policies>

输出-

enter image description here enter image description here

enter image description here enter image description here

追踪-

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.