控制流

适用于:所有 API 管理层级

使用 choose 策略根据布尔表达式的计算结果有条件地应用策略语句。 使用类似于编程语言中的 if-then-else 或 switch 构造的控制流的策略。

注意

按照策略声明中提供的顺序设置策略的元素和子元素。 详细了解如何设置或编辑 API 管理策略。

策略语句

<choose>
    <when condition="Boolean expression | Boolean constant">
        <!— one or more policy statements to be applied if the above condition is true  -->
    </when>
    <when condition="Boolean expression | Boolean constant">
        <!— one or more policy statements to be applied if the above condition is true  -->
    </when>
    <otherwise>
        <!— one or more policy statements to be applied if none of the above conditions are true  -->
    </otherwise>
</choose>

choose 策略必须至少包含一个 <when/> 元素。 <otherwise/> 元素是可选的。 <when/> 元素中的条件根据其在策略中的出现顺序求值。 将应用条件属性等于 <when/> 的第一个 true 元素中括住的策略语句。 在所有 <otherwise/> 元素条件属性为 <when/> 的情况下,将应用 false 元素中括住的策略(如果存在)。

元素

元素 说明 必需
什么时候 一个或多个指定 if 策略的 ifelse 或 choose 部分的元素。 如果指定了多个 when 元素,它们将按顺序计算。 一旦 when 元素的 condition 的求值结果为 true,不再对 when 条件求值。 是
否则 在没有任何 when 条件的计算结果为 true 的情况下进行计算的策略片段。 否

when 属性

属性 说明 必需
条件 对包含 when 的策略语句求值时需求值的布尔表达式或布尔常量。 是

使用情况

  • 策略节:入站、出站、后端、错误时
  • 策略范围:全局、工作区、产品、API、操作
  • 网关:经典、消耗、自承载

示例

基于用户代理修改请求和响应

以下示例演示 set-variable 策略和两项控制流策略。

此 set-variable 策略位于入站节,用于创建 isMobile 布尔isMobile变量,该变量在 User-Agent 请求标头包含文本 iPad 或 iPhone 的情况下设置为 true。

第一项控制流策略也位于入站节,并会根据 上下文变量的值有条件地应用两项isMobile策略之一。

第二项控制流策略位于出站节,并会在 设置为 isMobile 时有条件地应用true 策略。

<policies>
    <inbound>
        <set-variable name="isMobile" value="@(context.Request.Headers.GetValueOrDefault("User-Agent","").Contains("iPad") || context.Request.Headers.GetValueOrDefault("User-Agent","").Contains("iPhone"))" />
        <base />
        <choose>
            <when condition="@(context.Variables.GetValueOrDefault<bool>("isMobile"))">
                <set-query-parameter name="mobile" exists-action="override">
                    <value>true</value>
                </set-query-parameter>
            </when>
            <otherwise>
                <set-query-parameter name="mobile" exists-action="override">
                    <value>false</value>
                </set-query-parameter>
            </otherwise>
        </choose>
    </inbound>
    <outbound>
        <base />
        <choose>
            <when condition="@(context.Variables.GetValueOrDefault<bool>("isMobile"))">
                <xml-to-json kind="direct" apply="always" consider-accept-header="false"/>
            </when>
        </choose>
    </outbound>
</policies>

根据产品名称修改响应

以下示例演示了如何进行内容筛选,方法是:在使用 Starter 产品时删除从后端服务接收的响应中的数据元素。 示例后端响应包括类似于 OpenWeather One Call API 的根级别属性。

<!-- Copy this snippet into the outbound section to remove a number of data elements from the response received from the backend service based on the name of the product -->
<choose>
  <when condition="@(context.Response.StatusCode == 200 && context.Product.Name.Equals("Starter"))">
    <set-body>@{
        var response = context.Response.Body.As<JObject>();
        foreach (var key in new [] {"current", "minutely", "hourly", "daily", "alerts"}) {
          response.Property (key).Remove ();
        }
        return response.ToString();
      }
    </set-body>
  </when>
</choose>

有关使用策略的详细信息,请参阅: