Поток управления

ОБЛАСТЬ ПРИМЕНЕНИЯ: все уровни Управление API

choose Используйте политику для условного применения инструкций политики на основе результатов оценки логических выражений. Используйте политику для потока управления, аналогичного конструкции if-then-else или коммутатора на языке программирования.

Примечание.

Задайте элементы политики и дочерние элементы в порядке, указанном в правиле политики. Узнайте, как устанавливать или изменять политики службы управления 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.

Элементы

Элемент Description Обязательное поле
Если... Один или несколько элементов, if указывающих или ifelse части choose политики. Если задано несколько when элементов, они оцениваются последовательно. Когда condition элемента when принимает значение true, никакие последующие условия when не вычисляются. Да
otherwise Фрагмент политики, который необходимо оценить, если ни одно из условий when не оценивается true. No

Когда атрибуты

Атрибут Description Обязательное поле
condition Логическое выражение или логическая константа, вычисляемая при when оценке содержащего оператора политики. Да

Использование

Примеры

Изменение запроса и ответа на основе агента пользователя

В следующем примере демонстрируется политика set-variable и две политики управления потоками.

Политика задания переменной находится в разделе inbound и создает логическую переменную контекстаisMobile, которой присваивается значение true, если заголовок запроса User-Agent содержит текст iPad или iPhone.

Первая политика управления потоками также находится в разделе inbound и условно применяет одну из двух политик установки параметра строки запроса в зависимости от значения переменной контекста isMobile.

Вторая политика управления потоками находится в разделе outbound и условно применяет политику преобразования XML в JSON, если переменная 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. Пример ответа серверной части содержит свойства корневого уровня, аналогичные API вызовов OpenWeather One.

<!-- 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>

Дополнительные сведения о работе с политиками см. в нижеуказанных статьях.