Informacje o warunkach

Wyświetlasz dokumentację Apigee Edge.
Otwórz dokumentację Apigee X.
info

Warunki umożliwiają dynamiczne działanie serwerów proxy interfejsu API w czasie wykonywania. Warunki określają operacje na zmiennych, które są oceniane przez potok przetwarzania Apigee Edge. Instrukcje warunkowe są logiczne i zawsze zwracają wartość true lub false.

Omówienie warunków

W tej sekcji opisujemy, jak i gdzie używać instrukcji warunkowych w Edge. W sekcjach poniżej znajdziesz opis składni:

Struktura instrukcji warunkowych

Podstawowa struktura instrukcji warunkowej jest następująca:

<Condition>variable.name operator "value"</Condition>

Na przykład:

<Condition>request.verb = "GET"</Condition>

Możesz połączyć warunki za pomocą operatora AND, aby wymusić więcej niż 1 warunek naraz. Na przykład te warunki przyjmują wartość true tylko wtedy, gdy identyfikator URI żądania pasuje do /statuses i czasownik HTTP żądania to GET:

<Condition>(proxy.pathsuffix MatchesPath "/statuses") and (request.verb = "GET")</Condition>

Gdzie można używać instrukcji warunkowych

Warunków możesz używać do kontrolowania działania w tych obszarach:

Wykonywanie zasad

Za pomocą instrukcji warunkowych możesz kontrolować egzekwowanie zasad. Typowym przypadkiem użycia jest warunkowe przekształcanie wiadomości z odpowiedzią na podstawie nagłówka HTTP lub treści wiadomości.

Poniższy przykład warunkowo przekształca XML na JSON na podstawie nagłówka Accept:

<Step>
  <Condition>request.header.accept = "application/json"</Condition>
  <Name>XMLToJSON</Name>
</Step>

Wykonanie przepływu

Za pomocą instrukcji warunkowych możesz kontrolować wykonywanie nazwanych przepływów w elementach ProxyEndpoint i TargetEndpoint. Pamiętaj, że warunkowo można wykonywać tylko przepływy „nazwane”. Preflows i postflows (zarówno żądania, jak i odpowiedzi) w przypadku ProxyEndpoints i TargetEndpoints są wykonywane w przypadku każdej transakcji, a tym samym zapewniają bezwarunkowe możliwości „awaryjne”.

Na przykład aby wykonać przepływ żądania warunkowego na podstawie czasownika HTTP w wiadomości żądania i przepływ odpowiedzi warunkowej na podstawie (potencjalnego) kodu stanu HTTP reprezentującego błąd:

<Flow name="GetRequests">
  <Condition>request.verb = "GET"</Condition>
  <Request>
    <Step>
      <Condition>request.path MatchesPath "/statuses/**"</Condition>
      <Name>StatusesRequestPolicy</Name>
    </Step>
  </Request>
  <Response>
    <Step>
      <Condition>(response.status.code = 503) or (response.status.code = 400)</Condition>
      <Name>MaintenancePolicy</Name>
    </Step>
  </Response>
</Flow>

Wybór trasy docelowego punktu końcowego

Za pomocą instrukcji warunkowych możesz kontrolować docelowy punkt końcowy wywoływany przez konfigurację punktu końcowego proxy. Reguła trasy przekazuje żądanie do określonego docelowego punktu końcowego. Gdy dostępnych jest więcej niż 1 docelowy punkt końcowy, reguła trasy jest oceniana pod kątem warunku, a jeśli warunek jest spełniony, żądanie jest przekazywane do nazwanego docelowego punktu końcowego.

Aby na przykład warunkowo kierować wiadomości do wyznaczonych docelowych punktów końcowych na podstawie Content-Type:

<RouteRule name="default">
 <!--this routing executes if the header indicates that this is an XML call. If true, the call is routed to the endpoint XMLTargetEndpoint-->
  <Condition>request.header.Content-Type = "text/xml"</Condition>
  <TargetEndpoint>XmlTargetEndpoint</TargetEndpoint>
</RouteRule>

Więcej informacji znajdziesz w sekcji Zmienne przepływu i warunki.

Wyrażenia ścieżki

Wyrażenia ścieżki służą do dopasowywania ścieżek URI. Symbol „*” oznacza pojedynczy element ścieżki, a „**” – wiele poziomów URI.

Na przykład:

Wzór Przykładowe pasujące ścieżki identyfikatora URI
/*/a/ /x/a/ lub /y/a/
/*/a/* /x/a/b lub /y/a/foo
/*/a/** /x/a/b/c/d
/*/a/*/feed/ /x/a/b/feed/ lub /y/a/foo/feed/
/a/**/feed/** /a/b/feed/rss/1234

Znak % jest traktowany jako znak modyfikacji. Wzorzec %{user%} pasuje do adresu {user}, ale nie do adresu user.

Zmienne

W instrukcjach warunkowych możesz używać zarówno wbudowanych zmiennych przepływu, jak i zmiennych niestandardowych. Aby dowiedzieć się więcej, zobacz:

Operatory

Podczas korzystania z operatorów pamiętaj o tych ograniczeniach:

  • Operatorów nie można używać jako nazw zmiennych.
  • Przed operatorem i po nim musi znajdować się spacja.
  • Aby uwzględnić operatora w zmiennej, nazwę zmiennej należy ująć w apostrofy. Na przykład: 'request.header.help!me'.
  • Operatory arytmetyczne (+ * - / %) nie są obsługiwane.
  • W przypadku operatorów obowiązuje kolejność działań w języku Java.
  • Apigee Edge korzysta z wyrażeń regularnych zaimplementowanych w java.util.regex.

W tabeli poniżej znajdziesz listę obsługiwanych operatorów. W wyrażeniach możesz używać symbolu lub słowa:

Symbol Word Opis
! Not, not Operator jednoargumentowy (przyjmuje 1 dane wejściowe)
= Equals, Is Równa się (z uwzględnieniem wielkości liter)
!= NotEquals, IsNot Nie równa się (z uwzględnieniem wielkości liter)
:= EqualsCaseInsensitive Równa się, ale wielkość liter nie jest rozróżniana
> lub &gt; GreaterThan Większe niż. Jeśli podczas definiowania warunku w interfejsie Edge użyjesz znaku >, zostanie on przekonwertowany na &gt;.
>= lub &gt;= GreaterThanOrEquals Większe lub równe. Jeśli podczas definiowania warunku w interfejsie Edge użyjesz znaku >=, zostanie on przekonwertowany na &gt;=.
&lt; LesserThan Mniejsza niż. Interfejs Edge nie obsługuje znaku <.
&lt;= LesserThanOrEquals Mniejsze lub równe. Interfejs Edge nie obsługuje literału <=.
&& And, and I
|| Or Operator Or nie rozróżnia wielkości liter. Prawidłowe wartości to np. OR, Oror.
() Grupuje wyrażenie. Znak ( otwiera wyrażenie, a znak ) je zamyka.
~~ JavaRegex

Pasuje do wyrażenia regularnego zgodnego z javax.util.regex. Wielkość liter jest rozróżniana. Przykłady znajdziesz w artykule Dopasowywanie wzorców w instrukcjach warunkowych.

~ Matches, Like Dopasowuje wzorzec w stylu glob, używając symbolu wieloznacznego „*”. W tym przypadku rozróżniana jest wielkość liter. Przykłady znajdziesz w artykule Dopasowywanie wzorców z warunkami.
~/ MatchesPath, LikePath Pasuje do wyrażenia ścieżki. Wielkość liter jest rozróżniana w tej wartości. Przykłady znajdziesz w artykule Dopasowywanie wzorców z warunkami.
=| StartsWith Wskazuje dopasowanie do pierwszych znaków ciągu. Wielkość liter jest rozróżniana w tej wartości.

Operandy

Apigee Edge dostosowuje operandy do wspólnego typu danych przed ich porównaniem. Jeśli na przykład kod stanu odpowiedzi to 404, wyrażenia response.status.code = "400"response.status.code = 400 są równoważne.

W przypadku operandów liczbowych typ danych jest interpretowany jako liczba całkowita, chyba że wartość jest zakończona w następujący sposób:

  • „f” lub „F” (liczba zmiennoprzecinkowa, np. 3.142f, 91.1F)
  • „d” lub „D” (liczba podwójnej precyzji, np. 3,142d, 100,123D)
  • „l” lub „L” (liczba długa, np. 12321421312L)

W takich przypadkach system wprowadza zmiany przedstawione w tabeli poniżej (gdzie RHS oznacza prawą stronę równania, a LHS – lewą):

RHS LHS Wartość logiczna Liczba całkowita Długi Liczba zmiennoprzecinkowa Liczba zmiennoprzecinkowa Ciąg znaków Porównywalna Obiekt
Wartość logiczna Wartość logiczna Liczba całkowita Długi Liczba zmiennoprzecinkowa Liczba zmiennoprzecinkowa Ciąg znaków -
Liczba całkowita Liczba całkowita Liczba całkowita Długi Liczba zmiennoprzecinkowa Liczba zmiennoprzecinkowa Ciąg znaków Porównywalna -
Długi Długi Długi Długi Liczba zmiennoprzecinkowa Liczba zmiennoprzecinkowa Ciąg znaków Porównywalna -
Liczba zmiennoprzecinkowa Liczba zmiennoprzecinkowa Liczba zmiennoprzecinkowa Liczba zmiennoprzecinkowa Liczba zmiennoprzecinkowa Liczba zmiennoprzecinkowa Ciąg znaków Porównywalna -
Liczba zmiennoprzecinkowa Liczba zmiennoprzecinkowa Liczba zmiennoprzecinkowa Liczba zmiennoprzecinkowa Liczba zmiennoprzecinkowa Liczba zmiennoprzecinkowa Ciąg znaków Porównywalna -
Ciąg znaków Ciąg znaków Ciąg znaków Ciąg znaków Ciąg znaków Ciąg znaków Ciąg znaków Porównywalna -
Porównywalna Porównywalna Porównywalna Porównywalna Porównywalna Porównywalna Porównywalna Porównywalna -
Obiekt - - - - - - - -

Operandy o wartości null

W poniższej tabeli pokazano, czy warunki przyjmują wartość true czy false, gdy wartości po lewej stronie (LHS) lub po prawej stronie (RHS) operandu są wartościami null:

Operator LHS null RHS null Wartości null po lewej i prawej stronie
=, ==, := false false true
=| false false false
!= true true false
> lub &gt; true false false
>= lub &gt;= false true true
&lt; true false false
&lt;= true false true
~ false Nie dotyczy false
~~ false Nie dotyczy false
!~ true false false
~/ false Nie dotyczy false

Literały

Oprócz literałów tekstowych i numerycznych w instrukcjach warunkowych możesz używać tych literałów:

  • null
  • true
  • false

Na przykład:

  • request.header.host is null
  • flow.cachehit is true

Przykłady

<RouteRule name="default">
     <Condition>request.header.content-type = "text/xml"</Condition>
     <TargetEndpoint>XmlTargetEndpoint</TargetEndpoint>
</RouteRule>
<Step>
    <Condition>response.status.code = 503</Condition>
    <Name>MaintenancePolicy</Name>
</Step>
<Flow name="GetRequests">
    <Condition>response.verb="GET"</Condition>
    <Request>
        <Step>
            <Condition>request.path ~ "/statuses/**"</Condition>
            <Name>StatusesRequestPolicy</Name>
        </Step>
    </Request>
    <Response>
        <Step>
            <Condition>(response.status.code = 503) or (response.status.code = 400)</Condition>
            <Name>MaintenancePolicy</Name>
        </Step>
    </Response>
</Flow>