Prozkoumání zásad služby API Management

Dokončeno

Zásady ve službě Azure API Management umožňují vydavateli změnit chování rozhraní API prostřednictvím konfigurace. Zásady jsou kolekce příkazů, které se spouští postupně na požadavku nebo odpovědi rozhraní API.

Zásady se použijí uvnitř brány, která se nachází mezi příjemcem rozhraní API a spravovaným rozhraním API. Brána přijímá všechny požadavky a obvykle je nepředá do podkladového rozhraní API. Zásady ale můžou použít změny příchozí i odchozí odpovědi. Výrazy zásad můžete použít jako hodnoty atributů nebo textové hodnoty v libovolných zásadách API Management (pokud zásady neurčí jinak).

Principy konfigurace zásad

Definice zásady je jednoduchý dokument XML, který popisuje posloupnost příchozích a odchozích příkazů. XML lze upravit přímo v okně definice.

Konfigurace je rozdělena na inbound, backend, outbounda on-error. Řada zadaných prohlášení zásad se provede, aby se žádost a odpověď spustily.

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

Pokud během zpracování požadavku dojde k chybě, všechny zbývající kroky v oddílu inboundbackendnebo outbound oddíly se přeskočí a provádění přeskočí na příkazy v oddíluon-error. Umístěním prohlášení o zásadách do on-error části můžete chybu zkontrolovat pomocí context.LastError vlastnosti, zkontrolovat a přizpůsobit odpověď na chybu pomocí set-body zásady a nakonfigurovat, co se stane, když dojde k chybě.

Výrazy zásad

Pokud zásada neurčí jinak, výrazy zásad se dají použít jako hodnoty atributů nebo textové hodnoty v některé ze zásad služby API Management. Výraz zásad je buď:

  • jeden příkaz jazyka C# uzavřený v @(expression), nebo
  • blok kódu jazyka C# s více příkazy, který je uzavřený , @{expression}který vrací hodnotu

Každý výraz má přístup k implicitně poskytnuté context proměnné a povolené podmnožině typů rozhraní .NET Framework.

Výrazy zásad poskytují sofistikované prostředky pro řízení provozu a úpravu chování rozhraní API bez nutnosti psát specializovaný kód nebo upravovat back-endové služby.

Následující příklad používá výrazy zásad a zásadu hlavičky set k přidání uživatelských dat do příchozího požadavku. Přidaná hlavička obsahuje ID uživatele přidruženého k klíči předplatného v požadavku a oblast, kde brána zpracovává požadavek, je hostovaná.

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

Použití zásad zadaných v různých oborech

Pokud máte zásady na globální úrovni a zásady nakonfigurované pro rozhraní API, použijí se vždy, když se použijí obě zásady tohoto konkrétního rozhraní API. Služba API Management umožňuje deterministické řazení kombinovaných příkazů zásad prostřednictvím základního prvku.

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

V předchozí ukázkové definici zásady by se cross-domain příkaz spustil jako první. Zásady find-and-replace by se spouštěly po jakýchkoli zásadách v širším rozsahu.

Filtrování obsahu odpovědi

Zásada definovaná v následujícím příkladu ukazuje, jak filtrovat datové prvky z datové části odpovědi na základě produktu přidruženého k požadavku.

Fragment kódu předpokládá, že obsah odpovědi je formátovaný jako JSON a obsahuje vlastnosti kořenové úrovně pojmenované minutově, každou hodinu, denně a příznaky.

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