Знакомство с политиками службы "Управление API"
В Azure Управление API политики позволяют издателю изменять поведение API с помощью конфигурации. Политика — это коллекция операторов, которые выполняются последовательно по запросу интерфейса API или при получении из него ответа.
Политики применяются внутри шлюза, который находится между потребителем API и управляемым API. Шлюз получает все запросы и обычно отправляет их без изменения в базовый API. Однако политика может применять изменения как для входящего запроса, так и для исходящего ответа. Выражения политики можно использовать в качестве значений атрибутов или текстовых значений в любой политике управления API, если в ней не указано иное.
Общая информация о конфигурации политики
Определение политики представляет собой простой XML-документ, который описывает последовательность входящих и исходящих операторов. Файл XML можно редактировать прямо в окне определения.
Конфигурация состоит из таких операторов: inbound
, backend
, outbound
и on-error
. Набор указанных операторов политики выполняется для создания запроса и получения ответа.
<policies>
<inbound>
<!-- statements to be applied to the request go here -->
</inbound>
<backend>
<!-- statements to be applied before the request is forwarded to
the backend service go here -->
</backend>
<outbound>
<!-- statements to be applied to the response go here -->
</outbound>
<on-error>
<!-- statements to be applied if there is an error condition go here -->
</on-error>
</policies>
Если во время обработки запроса возникает ошибка, все остальные действия в inbound
backend
outbound
разделах пропускаются и выполняются инструкции в on-error
разделе. Поместив операторы политики в раздел on-error
, вы можете просмотреть ошибку с помощью свойства context.LastError
, изучить и настроить ответ на ошибку с помощью политики set-body
, а также настроить, что именно происходит при возникновении ошибки.
Выражения политики
Выражения политики можно использовать в качестве значений атрибутов или текстовых значений в любой политике Управления API, если в ней не указано иное. Выражение политики может быть следующим:
- один оператор C#, заключенный в
@(expression)
или - блок кода C# с несколькими операторами, заключенный в
@{expression}
, который возвращает значение.
У каждого выражения есть доступ к неявно заданной переменной context
и разрешенному подмножеству типов платформы .NET Framework.
Выражения политики предоставляют сложные средства для управления трафиком и изменения поведения API, не требуя написания специализированного кода или изменения внутренних служб.
В следующем примере используются выражения политики и политика набора заголовков для добавления пользовательских данных в входящий запрос. Добавленный заголовок содержит идентификатор пользователя, связанный с ключом подписки в запросе, и регион, в котором размещен шлюз, обрабатывающий запрос.
<policies>
<inbound>
<base />
<set-header name="x-request-context-data" exists-action="override">
<value>@(context.User.Id)</value>
<value>@(context.Deployment.Region)</value>
</set-header>
</inbound>
</policies>
Применение политик, заданных в разных областях
Если у вас есть политика на глобальном уровне и политика, настроенная для API, то всякий раз, когда используется этот конкретный API, применяются обе политики. API Management позволяет детерминированным образом упорядочивать объединенные операторы политик через основной элемент.
<policies>
<inbound>
<cross-domain />
<base />
<find-and-replace from="xyz" to="abc" />
</inbound>
</policies>
В предыдущем примере определения cross-domain
политики оператор будет выполняться сначала. Политика find-and-replace
будет выполняться после любых политик в более широкой области.
Фильтрация содержимого ответа
Политика, определенная в следующем примере, демонстрирует фильтрацию элементов данных из полезных данных ответа на основе продукта, связанного с запросом.
В фрагменте предполагается, что содержимое ответа отформатировано как JSON и содержит свойства корневого уровня с именем minutely, почасово, ежедневно и флаги.
<policies>
<inbound>
<base />
</inbound>
<backend>
<base />
</backend>
<outbound>
<base />
<choose>
<when condition="@(context.Response.StatusCode == 200 && context.Product.Name.Equals("Starter"))">
<!-- NOTE that we are not using preserveContent=true when deserializing response body stream into a JSON object since we don't intend to access it again. See details on /azure/api-management/api-management-transformation-policies#SetBody -->
<set-body>
@{
var response = context.Response.Body.As<JObject>();
foreach (var key in new [] {"minutely", "hourly", "daily", "flags"}) {
response.Property (key).Remove ();
}
return response.ToString();
}
</set-body>
</when>
</choose>
</outbound>
<on-error>
<base />
</on-error>
</policies>