Explore as políticas de gerenciamento de API

Concluído

No Gerenciamento de API do Azure, as políticas permitem que o editor altere o comportamento da API por meio da configuração. As políticas são uma coleção de instruções que são executadas sequencialmente na solicitação ou resposta de uma API.

As políticas são aplicadas dentro do gateway que fica entre o consumidor da API e a API gerenciada. O gateway recebe todas as solicitações e geralmente as encaminha inalteradas para a API subjacente. No entanto, uma política pode aplicar alterações à solicitação de entrada e à resposta de saída. As expressões de política podem ser utilizadas como valores de atributo ou valores de texto em qualquer uma das políticas de API Management, a menos que a política especifique o contrário.

Noções básicas sobre a configuração da política

A definição de política é um documento XML simples que descreve uma sequência de instruções de entrada e saída. O XML pode ser editado diretamente na janela de definição.

A configuração é dividida em inbound, , outboundbackend, e on-error. A série de instruções de política especificadas é executada para uma solicitação e uma resposta.

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

Se houver um erro durante o processamento de uma solicitação, todas as etapas restantes nas inboundseções , backendou outbound serão ignoradas e a execução salta para as instruções na on-error seção. Ao colocar instruções de on-error política na seção, você pode revisar o erro usando a propriedade, inspecionar e personalizar a resposta de erro usando a context.LastErrorset-body política e configurar o que acontece se ocorrer um erro.

Expressões de política

A menos que a política especifique o contrário, as expressões de política podem ser usadas como valores de atributo ou valores de texto em qualquer uma das políticas de Gerenciamento de API. Uma expressão política é:

  • uma única instrução C# incluída no @(expression), ou
  • um bloco de código C# com várias instruções, incluído no @{expression}, que retorna um valor

Cada expressão tem acesso à variável implicitamente fornecida context e a um subconjunto permitido de tipos do .NET Framework.

As expressões de política fornecem um meio sofisticado para controlar o tráfego e modificar o comportamento da API sem exigir que você escreva código especializado ou modifique serviços de back-end.

O exemplo a seguir usa expressões de política e a política set-header para adicionar dados do usuário à solicitação de entrada. O cabeçalho adicionado inclui o ID de usuário associado à chave de assinatura na solicitação e a região onde o gateway que processa a solicitação está hospedado.

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

Aplicar políticas especificadas em escopos diferentes

Se você tiver uma política em nível global e uma política configurada para uma API, sempre que essa API específica for usada, ambas as políticas serão aplicadas. O Gerenciamento de API permite a ordenação determinística de declarações de política combinadas por meio do elemento base.

<policies>
    <inbound>
        <cross-domain />
        <base />
        <find-and-replace from="xyz" to="abc" />
    </inbound>
</policies>

No exemplo anterior definição de política, A cross-domain instrução seria executada primeiro. A política seria executada find-and-replace após quaisquer políticas em um escopo mais amplo.

Filtrar conteúdo de resposta

A política definida no exemplo a seguir demonstra como filtrar elementos de dados da carga útil de resposta com base no produto associado à solicitação.

O trecho pressupõe que o conteúdo da resposta é formatado como JSON e contém propriedades de nível raiz chamadas "minutely", "hourly", "daily", "flags".

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