Przeglądasz dokumentację Apigee Edge.
Otwórz dokumentację Apigee X. Informacje
Warunki umożliwiają dynamiczne zachowanie serwerów proxy interfejsu API w czasie działania. Warunki definiują operacje na zmiennych, które są oceniane przez potok przetwarzania Apigee Edge. Instrukcje warunkowe są logiczne i zawsze zwracają wartość true
lub false
.
Przegląd warunków
W tej sekcji opisaliśmy, jak i gdzie używać instrukcji warunkowych w Edge. Dodatkowo w tych sekcjach opisano składnię:
Struktura instrukcji warunkowych
Podstawowa struktura instrukcji warunkowej to:
<Condition>variable.name operator "value"</Condition>
Na przykład:
<Condition>request.verb = "GET"</Condition>
Aby wyegzekwować więcej niż 1 warunek naraz, możesz połączyć go z operatorem ORAZ. Na przykład poniższe warunki przyjmują wartość true
tylko wtedy, gdy identyfikator URI żądania odpowiada ciągowi /statuses
, a czasownik HTTP żądania to GET
:
<Condition>(proxy.pathsuffix MatchesPath "/statuses") and (request.verb = "GET")</Condition>
Gdzie można używać instrukcji warunkowych
Za pomocą warunków możesz kontrolować działanie tych elementów:
Wykonanie zasady
Za pomocą instrukcji warunkowych możesz kontrolować egzekwowanie zasad. Typowym przypadkiem użycia jest warunkowe przekształcanie wiadomości z odpowiedziami na podstawie nagłówka HTTP lub treści wiadomości.
Ten przykład warunkowo przekształca kod 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 punktach ProxyEndpoints i TargetEndpoints. Pamiętaj, że warunkowo można wykonywać tylko „nazwane” przepływy. Przepływy wstępne i końcowe (zarówno żądania, jak i odpowiedzi) w ProxyEndpoints i TargetEndpoints są realizowane dla każdej transakcji, dzięki czemu zapewniają bezwarunkowe możliwości „failsafe”.
Aby na przykład wykonać przepływ warunkowego żądania na podstawie czasownika HTTP komunikatu z żądaniem oraz przepływu odpowiedzi warunkowej na podstawie (potencjalnego) kodu stanu HTTP wskazują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 serwera proxy. Reguła trasy przekierowuje żą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 swojego warunku, a jeśli ma wartość prawda, żą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 artykule Zmienne i warunki przepływu.
Wyrażenia ścieżki
Wyrażenia ścieżki służą do dopasowywania ścieżek identyfikatora URI, gdzie symbol „*” oznacza pojedynczy element ścieżki oraz „**” oznacza wiele poziomów identyfikatorów URI.
Na przykład:
Wzór | Przykładowe ścieżki identyfikatora URI zostały dopasowane |
---|---|
/*/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 |
Symbol %
jest traktowany jako znak zmiany znaczenia. Wzór %{user%}
pasuje do wyrażenia {user}
, ale nie do user
.
Zmienne
W instrukcjach warunkowych możesz używać zarówno zmiennych wbudowanych, jak i niestandardowych. Aby dowiedzieć się więcej, zobacz:
- Dokumentacja zmiennych przepływu: pełna lista zmiennych wbudowanych.
- Zasada ExtractVariables: instrukcje konfigurowania zmiennych niestandardowych
Operatory
Podczas korzystania z operatorów obowiązują te ograniczenia:
- Operatorów nie można używać jako nazw zmiennych.
- Przed operatorem i po nim musi być spacja.
- Aby operator umieścić w zmiennej, musisz ją ująć w pojedyncze cudzysłowy.
Na przykład:
'request.header.help!me'
. - Operatory arytmetyczne (
+ * - / %
) nie są obsługiwane. - W przypadku operatorów używane jest pierwszeństwo w języku Java.
- Apigee Edge korzysta z wyrażeń regularnych, które zostały zaimplementowane w
java.util.regex
.
W tabeli poniżej znajdziesz listę obsługiwanych operatorów. W wyrażeniach możesz używać tego symbolu lub słowa:
Symbol | Słowo | Opis |
---|---|---|
! |
Not , not |
Operator jednoargumentowy (pojedynczy zapis) |
= |
Equals , Is |
Równa się (z uwzględnieniem wielkości liter) |
!= |
NotEquals , IsNot |
Nie równa się (wielkość liter ma znaczenie) |
:= |
EqualsCaseInsensitive |
Są równe, ale wielkość liter nie jest rozróżniana |
> lub > |
GreaterThan |
Większe niż. Jeśli do definiowania warunku w interfejsie użytkownika Edge użyjesz znaku >, zostanie on przekonwertowany na znak >. |
>= lub >= |
GreaterThanOrEquals |
Większe niż lub równe. Jeśli do definiowania warunku w interfejsie użytkownika Edge użyjesz znaku >=, zostanie on przekonwertowany na znak >=. |
< |
LesserThan |
Mniejsze niż. Interfejs Edge nie obsługuje literału <. |
<= |
LesserThanOrEquals |
Mniejsze lub równe. Interfejs Edge nie obsługuje literału <=. |
&& |
And , and |
i |
|| |
Or |
W operatorze Or nie jest rozróżniana wielkość liter. Prawidłowe wartości to np. OR , Or i or . |
() |
Grupuje wyrażenie. ( otwiera wyrażenie, a ) je zamyka. |
|
~~ |
JavaRegex |
Pasuje do wyrażenia regularnego zgodnego z |
~ |
Matches , Like |
Pasuje do wzorca w stylu glob za pomocą symbolu wieloznacznego „*”. Wielkość liter w dopasowaniu ma znaczenie. Przykłady znajdziesz w artykule Dopasowywanie do wzorca za pomocą warunków warunkowych. |
~/ |
MatchesPath , LikePath |
Pasuje do wyrażenia ścieżki. Wielkość liter w dopasowaniu ma znaczenie. Przykłady znajdziesz w artykule Dopasowywanie do wzorca za pomocą warunków warunkowych. |
=| |
StartsWith |
Odpowiada pierwszym znakom ciągu. Wielkość liter w dopasowaniu ma znaczenie. |
Argumenty
Apigee Edge dostosowuje operandy do wspólnego typu danych, zanim je porównasz. Jeśli na przykład kod stanu odpowiedzi to 404, wyrażenie response.status.code = "400"
i response.status.code = 400
są równoważne.
W przypadku operandów liczbowych typ danych jest interpretowany jako liczba całkowita, chyba że wartość zostanie zakończona w ten sposób:
- „f” lub „F” (np. 3.142f, 91.1F)
- „d” lub „D” (liczba zmiennoprzecinkowa, np. 3.142d, 100.123D)
- „l” lub „L” (długi, np. 12321421312L)
W takich przypadkach system przeprowadza adaptacje przedstawione w poniższej tabeli (gdzie RHS odnosi się do prawej strony równania, a LHS – do lewej):
LHS z prawej strony | Wartość logiczna | Liczba całkowita | Długa liczba całkowita | Liczba zmiennoprzecinkowa | Double | Ciąg znaków | Porównywalna | Obiekt |
---|---|---|---|---|---|---|---|---|
Wartość logiczna | Wartość logiczna | Liczba całkowita | Długa liczba całkowita | Liczba zmiennoprzecinkowa | Double | Ciąg znaków | - | |
Liczba całkowita | Liczba całkowita | Liczba całkowita | Długa liczba całkowita | Liczba zmiennoprzecinkowa | Double | Ciąg znaków | Porównywalna | - |
Długa liczba całkowita | Długa liczba całkowita | Długa liczba całkowita | Długa liczba całkowita | Liczba zmiennoprzecinkowa | Double | Ciąg znaków | Porównywalna | - |
Liczba zmiennoprzecinkowa | Liczba zmiennoprzecinkowa | Liczba zmiennoprzecinkowa | Liczba zmiennoprzecinkowa | Liczba zmiennoprzecinkowa | Double | Ciąg znaków | Porównywalna | - |
Double | Double | Double | Double | Double | Double | 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 | - | - | - | - | - | - | - | - |
Argumenty o wartości null
W tabeli poniżej pokazujemy, czy warunki przyjmują wartość true
czy false
, gdy wartości po lewej (LHS) lub prawej (RHS) wyświetlanego operandu mają wartość null:
Operator | LHS null | RHS null | LHS i RHS null |
---|---|---|---|
= , == , := |
false | false | prawda |
=| |
false | false | false |
!= |
prawda | prawda | false |
> lub > |
prawda | false | false |
>= lub >= |
false | prawda | prawda |
< |
prawda | false | false |
<= |
prawda | false | prawda |
~ |
false | Nie dotyczy | false |
~~ |
false | Nie dotyczy | false |
!~ |
prawda | false | false |
~/ |
false | Nie dotyczy | false |
Literały
Oprócz literałów ciągów i liczb w instrukcjach warunkowych możesz też 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>