Explorar políticas de Gerenciamento de API

Concluído

No Gerenciamento de API do Azure, as políticas permitem ao editor alterar o comportamento da API por meio da configuração. As políticas são um conjunto de instruções executadas em sequência, no momento da solicitação ou da 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 normalmente as encaminha inalteradas à API subjacente. No entanto, uma política também pode aplicar mudanças à solicitação de entrada e à resposta de saída. Expressões de política podem ser usadas como valores de atributo ou texto em qualquer uma das políticas de Gerenciamento de API, a menos que a política especifique o contrário.

Compreendendo configuração de políticas

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

A configuração é dividida em inbound, backend, outbound e on-error. A série de instruções de política especificadas é executada ordenadamente 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, quaisquer etapas restantes nas seções inbound, backend ou outbound serão ignoradas e a execução saltará para as instruções na seção on-error. Ao colocar instruções de políticas na seção on-error, você pode revisar o erro usando a propriedade context.LastError, inspecionar e personalizar a resposta de erro usando a política set-body 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 texto em qualquer uma das políticas de Gerenciamento de API. A expressão de política é:

  • uma única instrução C# em @(expression) ou
  • um bloco de códigos C# de várias instruções, em @{expression} que retorna um valor

Cada expressão tem acesso à variável context fornecida implicitamente e a um subconjunto permitido de tipos de .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 um código especializado ou modifique serviços de back-end.

O exemplo a seguir usa expressões de política e a política de cabeçalho definido para adicionar dados do usuário à solicitação recebida. O cabeçalho adicionado inclui a ID do usuário associada à chave de assinatura na solicitação e a região em que o gateway que está processando 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 a escopos diferentes

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

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

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

Filtrar o conteúdo da resposta

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

O trecho de código pressupõe que o conteúdo da resposta é formatado como JSON e contém propriedades no nível da raiz denominadas minutos, por hora, diariamente e sinalizadores.

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