Eksplorowanie zasad usługi API Management

Ukończone

W usłudze Azure API Management zasady umożliwiają wydawcy zmianę zachowania interfejsu API za pomocą konfiguracji. Zasady to kolekcja instrukcji, które są wykonywane sekwencyjnie na żądanie lub odpowiedź interfejsu API.

Zasady są stosowane wewnątrz bramy, która znajduje się między odbiorcą interfejsu API a zarządzanym interfejsem API. Brama odbiera wszystkie żądania i zwykle przekazuje je niezauniknięty do bazowego interfejsu API. Jednak zasady mogą stosować zmiany zarówno do żądania przychodzącego, jak i odpowiedzi wychodzącej. Wyrażenia zasad mogą służyć jako wartości atrybutów lub wartości tekstowe w dowolnej z zasad usługi API Management, o ile w zasadach nie określono inaczej.

Informacje o konfiguracji zasad

Definicja zasad to prosty dokument XML opisujący sekwencję instrukcji przychodzących i wychodzących. Kod XML można edytować bezpośrednio w oknie definicji.

Konfiguracja jest podzielona na inbound, , backendoutboundi on-error. Seria określonych instrukcji zasad jest wykonywana w celu żądania i odpowiedzi.

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

Jeśli podczas przetwarzania żądania wystąpi błąd, pozostałe kroki w inboundsekcjach , backendlub outbound zostaną pominięte, a wykonanie przejdzie do instrukcji w on-error sekcji . Umieszczając instrukcje zasad w on-error sekcji, możesz przejrzeć błąd przy użyciu właściwości, sprawdzić i dostosować odpowiedź na błędy przy context.LastError użyciu set-body zasad i skonfigurować, co się stanie w przypadku wystąpienia błędu.

Wyrażenia zasad

Jeśli zasady nie określają inaczej, wyrażenia zasad mogą być używane jako wartości atrybutów lub wartości tekstowe w dowolnej z zasad usługi API Management. Wyrażenie zasad to:

  • pojedyncza instrukcja języka C# ujęta w , @(expression)lub
  • blok kodu języka C# z wieloma instrukcjami , który @{expression}zwraca wartość

Każde wyrażenie ma dostęp do niejawnie podanej context zmiennej i dozwolonego podzestawu typów programu .NET Framework.

Wyrażenia zasad zapewniają zaawansowane metody kontrolowania ruchu i modyfikowania zachowania interfejsu API bez konieczności pisania wyspecjalizowanego kodu lub modyfikowania usług zaplecza.

W poniższym przykładzie użyto wyrażeń zasad i zasad set-header w celu dodania danych użytkownika do żądania przychodzącego. Dodany nagłówek zawiera identyfikator użytkownika skojarzony z kluczem subskrypcji w żądaniu oraz region, w którym brama przetwarza żądanie.

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

Stosowanie zasad określonych w różnych zakresach

Jeśli masz zasady na poziomie globalnym i zasady skonfigurowane dla interfejsu API, zawsze, gdy dany interfejs API jest używany, oba zasady są stosowane. Usługa API Management umożliwia deterministyczne porządkowanie połączonych instrukcji zasad za pośrednictwem elementu podstawowego.

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

W poprzedniej przykładowej definicji zasad instrukcja będzie wykonywana cross-domain jako pierwsza. Zasady find-and-replace będą wykonywane po wszystkich zasadach w szerszym zakresie.

Filtrowanie zawartości odpowiedzi

Zasady zdefiniowane w poniższym przykładzie pokazują, jak filtrować elementy danych z ładunku odpowiedzi na podstawie produktu skojarzonego z żądaniem.

W fragmencie kodu przyjęto założenie, że zawartość odpowiedzi jest formatowana jako JSON i zawiera właściwości na poziomie głównym o nazwie minutely, hourly, daily i flagi.

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