Przeglądasz dokumentację Apigee Edge.
Przejdź do
Dokumentacja Apigee X. informacje.
Instrukcje warunkowe to powszechna struktura kontrolna we wszystkich językach programowania. Podobne do języka programowania, konfiguracja serwera proxy API obsługuje instrukcje warunkowe dla Flows, Zasady, kroki i reguły trasy. Definiując instrukcje warunkowe, definiujesz zachowanie dynamiczne dla swojego interfejsu API. To dynamiczne zachowanie pozwala np. konwertować zawartość pliku XML na format JSON tylko w przypadku telefony komórkowe lub kierowanie na URL backendu na podstawie typu treści lub czasownika HTTP żądania. .
Z tego artykułu dowiesz się, jak używać warunków do dynamicznego stosowania funkcji zarządzania interfejsami API w: środowiska wykonawczego bez konieczności pisania kodu.
Konfigurowanie instrukcji warunkowych
Działanie warunkowe jest implementowane na serwerach proxy interfejsu API przy użyciu kombinacji warunków. i zmienne. Instrukcja warunkowa jest tworzona za pomocą elementu warunku. Poniżej to pusty warunek:
<Condition></Condition>
Aby utworzyć wyrażenie warunkowe, dodaj operator warunkowy i zmienną, która posłuży do utworzenia następującą strukturę:
<Condition>{variable.name}{operator}{"value"}</Condition>
Obsługiwane operatory warunkowe to =
(równa się), !=
(nie równa się),
i >
(większe od). Aby zwiększyć czytelność, warunki warunkowe możesz też zapisać jako
tekst: equals
, notequals
, greaterthan
.
Podczas pracy ze ścieżkami URI możesz użyć ~/
lub MatchesPath
. Dostępne opcje
do wyrażenia regularnego JavaRegex możesz też dopasować do operatora ~~.
Warunki są używane do definiowania warunkowych przepływów API serwera proxy interfejsu API do zasobów interfejsu API backendu, co opisano w artykule o tworzeniu przepływów warunkowych do zasobów interfejsu API backendu. Dla: Pełną listę warunków znajdziesz w artykule o warunkach.
Zmienne
Warunki działają, oceniając wartości zmiennych. Zmienna to właściwość transakcji HTTP wykonywanej przez serwer proxy interfejsu API lub właściwość serwera proxy interfejsu API. i samej konfiguracji. Za każdym razem, gdy serwer proxy interfejsu API otrzyma żądanie z aplikacji, Apigee Edge zapełnia pole długa lista zmiennych powiązanych z czasem systemowym, siecią aplikacji informacje, nagłówki HTTP w wiadomościach, konfiguracja serwera proxy API, uruchomienia zasad itd. W ten sposób uzyskasz szczegółowy kontekst, którego możesz używać do konfigurowania instrukcji warunkowych.
Zmienne zawsze używają notacji kropkowanej. Na przykład nagłówki HTTP w wiadomości żądania są
dostępne jako zmienne o nazwie request.header.{header_name}
. Aby więc ocenić
W nagłówku typu treści możesz użyć zmiennej request.header.Content-type
. Dla:
przykład request.header.Content-type = "application/json"
wskazuje, że treść
żądania powinno być zapisane w formacie JSON.
Wyobraź sobie, że musisz utworzyć stwierdzenie warunkowe, które spowoduje, że zasada
jest egzekwowane tylko wtedy, gdy wiadomość z żądaniem jest metodą GET. Aby utworzyć warunek oceniający czasownik HTTP
dla żądania tworzysz instrukcję warunkową poniżej. Zmienna w tym warunku to
request.verb
Wartość zmiennej wynosi GET
. Operatorem jest
=
<Condition>request.verb = "GET"</Condition>
<Condition>request.verb equals "GET"</Condition>
Edge używa takiego wyrażenia do oceny warunków. W tym przykładzie zwracamy wartość prawda, jeśli Czasownik HTTP powiązany z żądaniem to GET. Jeśli czasownik HTTP powiązany z żądaniem to POST, instrukcja zwraca wartość false (fałsz).
Aby włączyć zachowanie dynamiczne, możesz dołączyć warunki do przepływów, kroków i reguł trasy.
Gdy dołączysz warunek do przepływu, tworzysz „przepływ warunkowy”. Przepływy warunkowe wykonywane tylko wtedy, gdy warunek ma wartość prawda. Możesz dołączyć dowolną liczbę zasad przepływu warunkowego. Przepływ warunkowy umożliwia tworzenie wyspecjalizowanych reguł przetwarzania w przypadku wiadomości z żądaniami lub odpowiedziami, które spełniają określone kryteria.
Aby np. utworzyć przepływ, który jest wykonywany tylko wtedy, gdy czasownik żądania to GET:
<Flows> <Flow name="ExecuteForGETs"> <Condition>request.verb="GET"</Condition> </Flow> </Flows>
Aby utworzyć jeden przepływ dla żądań GET i inny dla POST:
<Flows> <Flow name="ExecuteForGETs"> <Condition>request.verb="GET"</Condition> </Flow> <Flow name="ExecuteForPOSTs"> <Condition>request.verb="POST"</Condition> </Flow> </Flows>
Jak widać na przykładzie poniżej, możesz zastosować warunek do samego kroku zasad. poniższy warunek powoduje, że zasada VerifyApiKey jest egzekwowana tylko wtedy, gdy wiadomość żądania jest POST.
<PreFlow name="PreFlow"> <Request> <Step> <Condition>request.verb equals "POST"</Condition> <Name>VerifyApiKey</Name> </Step> </Request> </PreFlow>
Po zdefiniowaniu takich przepływów warunkowych możesz dołączyć do nich zasady, włączając interfejs API serwera proxy do egzekwowania jednego zestawu zasad dla żądań GET i innego dla POST żądań.
Pełne informacje znajdziesz w tych materiałach:
Przykład 1
Poniższy przykład to pojedynczy przepływ warunkowy o nazwie Convert-for-devices
.
skonfigurowane w procesie odpowiedzi ProxyEndpoint. Dodaj warunek jako element do elementu
do którego ma zastosowanie dany warunek. W tym przykładzie warunek jest komponentem przepływu.
Dlatego przepływ będzie wykonywany za każdym razem, gdy instrukcja zwróci wartość prawda.
<Flows> <Flow name="Convert-for-devices"> <Condition>(request.header.User-Agent = "Mozilla")</Condition> <Response> <Step><Name>ConvertToJSON</Name></Step> </Response> </Flow> </Flows>
Dla każdego żądania otrzymanego z aplikacji Edge przechowuje wartości wszystkich nagłówków HTTP obecnych jako
zmiennych. Jeśli żądanie zawiera nagłówek HTTP o nazwie User-Agent
, nagłówek ten oraz
jego wartość jest przechowywana jako zmienna o nazwie request.header.User-Agent
.
Biorąc pod uwagę powyższą konfigurację ProxyEndpoint, Edge sprawdza wartość
request.header.User-Agent
, aby sprawdzić, czy warunek przyjmuje wartość
true (prawda).
Jeśli warunek zostanie spełniony, oznacza to, że wartość zmiennej
request.header.User-Agent
równa się Mozilla
, a następnie przepływ warunkowy
i egzekwowana jest zasada XMLtoJSON o nazwie ConvertToJSON
. Jeśli nie, raport Flow
nie zostanie wykonany, a odpowiedź XML zostanie zwrócona w postaci niezmodyfikowanej (w formacie XML) do żądania
.
Przykład 2
Wykorzystajmy konkretny przykład, w którym musisz przekształcić wiadomość odpowiedzi z pliku XML na JSON, ale tylko na urządzeniach mobilnych. Najpierw utwórz zasadę, która przekształci Odpowiedź w formacie XML z interfejsu Weather API do JSON:
<XMLToJSON name="ConvertToJSON"> <Options> </Options> <OutputVariable>response</OutputVariable> <Source>response</Source> </XMLToJSON>
Powyższa konfiguracja zasad informuje serwer proxy interfejsu API, aby pobrać komunikat z odpowiedzią, wykonać
konwersji z XML na JSON z ustawieniami domyślnymi, a następnie zapisać wynik w nowej odpowiedzi
. Jeśli konwertujesz wiadomość żądanie z XML-a na JSON, ustaw oba parametry
te wartości do request
).
Chcesz przekonwertować odpowiedzi z XML na JSON, musisz więc skonfigurować do wykonania konwersji. Aby na przykład przekonwertować wszystkie odpowiedzi z formatu XML na JSON, przed ich zwróceniem do aplikacji klienckiej skonfiguruj następującą odpowiedź ProxyEndpoint Flow.
<Flows> <Flow name="Convert-for-devices"> <Response> <Step><Name>ConvertToJSON</Name></Step> </Response> </Flow> </Flows>
Gdy wywołujesz interfejs API za pomocą żądania standardowego, odpowiedź jest sformatowana w formacie JSON.
Jednak Twoim celem jest konwertowanie raportów pogodowych tylko na format JSON, gdy klient, który wysłał żądanie, jest urządzeniem mobilnym. Aby umożliwić takie dynamiczne zachowanie, musisz dodać instrukcję warunkową do przepływu.
Testowanie warunku warunkowego przepływ
W tym przykładowym żądaniu nagłówek HTTP User-Agent
jest ustawiony na
Mozilla
, przez co wyrażenie warunkowe przyjmuje wartość prawda, a warunek warunkowy
proces Convert-for-devices
do wykonania.
$ curl -H "User-Agent:Mozilla" http://{org_name}-test.apigee.net/weather/forecastrss?w=12797282
lub pisać ładnie tam, gdzie dostępny jest Python:
$ curl -H "User-Agent:Mozilla" http://{org_name}-test.apigee.net/weather/forecastrss?w=12797282 | python -mjson.tool
Przykładowa odpowiedź:
. . . "yweather_forecast": [ { "code": "11", "date": "12 Dec 2012", "day": "Wed", "high": "55", "low": "36", "text": "Showers" }, { "code": "32", "date": "13 Dec 2012", "day": "Thu", "high": "56", "low": "38", "text": "Sunny" } ] } . . .
Żądanie przesłane bez nagłówka User-Agent
lub z inną wartością niż
Mozilla
zwróci odpowiedź w formacie XML.
$ curl http://{org_name}-test.apigee.net/weather/forecastrss?w=12797282
Zwracana jest niezmodyfikowana odpowiedź XML.
Przykładowa odpowiedź:
<yweather:forecast day="Wed" date="12 Dec 2012" low="36" high="55" text="Showers" code="11" /> <yweather:forecast day="Thu" date="13 Dec 2012" low="38" high="56" text="Sunny" code="32" />
Dopasowywanie do wzorca
Z tej sekcji dowiesz się, jak używać dopasowania do wzorca z warunkami w przepływie Apigee.
Operatory
W tej sekcji opisujemy, jak korzystać z operatorów dopasowania do wzorca w warunkach warunkowych wyciągi:
- Pasuje do operatora: proste dopasowywanie wzorców
- Operator JavaRegex: dokładniejsza kontrola nad dopasowywaniem
- Operator matchPath: dopasowywanie fragmentów ścieżki
Odpowiada
Spójrzmy na kartę „Dopasowania” lub „~” z operatorem warunkowym. Te dwa operatory to ta sama – wersja angielska „Dopasowania” jest uważana za bardziej czytelną opcję.
Podsumowanie: „Pojedynki” daje dwie możliwości. Dopasuj do lub użyć symbolu wieloznacznego z symbolem „*”. Jak można się spodziewać, symbol wieloznaczny ma wartość zero lub więcej znaków. Zobaczmy, jak to działa.
Poniższy kod XML zawiera warunek kroku. Wykonuje zasadę somePolicy, gdy warunek
zwraca wartość prawda. W tym przykładzie testujemy zmienną proxy.pathsuffix
,
wbudowanej zmiennej Edge, która przechowuje sufiks ścieżki żądania. Pamiętaj, że możesz przetestować
wartość dowolnej zmiennej przepływu zawierającej ciąg znaków. Zatem w tym przypadku, jeśli ścieżka podstawowa
żądanie przychodzące ma wartość /animals
, a żądanie /animals/cat
,
sufiks ścieżki to ciąg literału „/cat
”.
<PreFlow name="PreFlow"> <Request> <Step> <Condition>(proxy.pathsuffix Matches "/cat")</Condition> <Name>SomePolicy</Name> </Step> </Request> <Response/> </PreFlow>
Pytanie: który sufiks ścieżki serwera proxy spowoduje wykonanie reguły somePolicy? Jest tylko jedna możliwość.
Wywołanie interfejsu API:
GET http://artomatic-test.apigee.net/matchtest/cat
Czy zasada jest wdrażana? Tak, ponieważ sufiks ścieżki serwera proxy pasuje do „/cat
”
dokładnie. Nie zostanie wykonane, jeśli sufiks to /bat
, /dog
lub
„/
” czy cokolwiek innego.
Przyjrzyjmy się teraz instrukcji warunkowej, w której używamy symbolu wieloznacznego.
„*
”:
<Condition>(proxy.pathsuffix Matches "/*at")</Condition>
Wywołanie interfejsu API:
GET http://artomatic-test.apigee.net/matchtest/cat
Czy zasada jest wdrażana? Tak, ponieważ symbol wieloznaczny pasuje do dowolnego znaku,
"/cat
′′ pasuje.
Wywołanie interfejsu API:
GET http://artomatic-test.apigee.net/matchtest/bat
Czy zasada jest wdrażana? Tak, ponieważ symbol wieloznaczny pasuje do dowolnego znaku, "/bat"
pasuje.
Wywołanie interfejsu API:
GET http://artomatic-test.apigee.net/matchtest/owl
Czy zasada jest wdrażana? Nie – chociaż symbol wieloznaczny pasuje do „o
”,
litery „wl
” nie są dopasowane.
Przenieśmy teraz symbol wieloznaczny na koniec sufiksu:
<Condition>(proxy.pathsuffix Matches "/cat*")</Condition>
Wywołanie interfejsu API:
GET http://artomatic-test.apigee.net/matchtest/cat
Czy zasada jest wdrażana? Tak, ponieważ symbol wieloznaczny pasuje do 0 lub większej liczby znaków.
Wywołanie interfejsu API:
GET http://artomatic-test.apigee.net/matchtest/bat
Czy zasada jest wdrażana? Nie, „/bat
” nie pasuje.
Wywołanie interfejsu API:
GET http://artomatic-test.apigee.net/matchtest/cat123
Czy zasada jest wdrażana? Tak, symbol wieloznaczny odpowiada zero lub więcej dowolnych znaków, dlatego
„123
” daje dopasowanie.
Wywołanie interfejsu API:
GET http://artomatic-test.apigee.net/matchtest/cat/bird/mouse
Czy zasada jest wdrażana? Tak. Symbol wieloznaczny odpowiada zero lub więcej znaków, więc
„/bird/mouse
” daje dopasowanie. Zastanów się, jak za pomocą tego wyrażenia wciągniesz
problem, ponieważ pasuje do wszystkiego po dosłownych znakach!
Pytanie: czy w operatorze Dopasowania rozróżniana jest wielkość liter?
Tak. Załóżmy, że Twój warunek jest taki:
<Condition>(proxy.pathsuffix Matches "/*At")</Condition>
Wywołanie interfejsu API:
GET http://artomatic-test.apigee.net/matchtest/cat
Czy zasada jest wdrażana? Nie. Symbol wieloznaczny odpowiada dowolnej literze (w każdym przypadku), ale małe litery „a” nie pasuje do „A”.
Wywołanie interfejsu API:
GET http://artomatic-test.apigee.net/matchtest/bAt
Czy zasada jest wdrażana? Tak, przypadek się zgadza.
Pytanie: Jak zmienić znaczenie znaków przy użyciu operatora Dopasowania?
Używaj procentu „%” w celu zmiany znaczenia znaków zarezerwowanych. Na przykład:
<Condition>(proxy.pathsuffix Matches "/c%*at")</Condition>
Wywołanie interfejsu API:
GET http://artomatic-test.apigee.net/matchtest/cat
Czy zasada jest wdrażana? Nie, operator Dopasowania szuka ciągu literału „c*at”.
Wywołanie interfejsu API:
GET http://artomatic-test.apigee.net/matchtest/c*at
Pytanie:Czy zasady są wdrażane?
Tak, ta ścieżka pasuje, choć jest nieco nietypowa.
JavaRegex
Jak widać, pole „Dopasowania” jest bardzo przydatne w prostych sytuacjach. Możesz też użyć innego „JavaRegex” lub „~~” . Te dwa operatory to ten sam operator, z wyjątkiem tego, że JavaRegex to które są czytelniejsze. Nazywa się JavaRegex, ponieważ pozwala na wyrażenia regularne do wzorca, a Edge przestrzega tych samych reguł co w klasach w argumencie java.util.regex pakiet w języku Java. Sposób działania operatora JavaRegex znacznie się różni od Pasuje do operatora, dlatego nie należy ich mylić.
Podsumowanie: „JavaRegex” pozwala używać składni wyrażeń regularnych w instrukcjach warunkowych.
Ten kod przedstawia warunek kroku. Wykonuje zasadę somePolicy, jeśli warunek
zwraca wartość prawda. W tym przykładzie testujemy wbudowaną zmienną proxy.pathsuffix
w Edge, która przechowuje sufiks ścieżki żądania. Jeśli ścieżka podstawowa argumentu
żądanie przychodzące ma wartość /animals
, a żądanie /animals/cat
,
sufiks ścieżki to ciąg literału „/cat
”.
<PreFlow name="PreFlow"> <Request> <Step> <Condition>(proxy.pathsuffix JavaRegex "/cat")</Condition> <Name>SomePolicy</Name> </Step> </Request> <Response/> </PreFlow>
Pytanie: który sufiks ścieżki serwera proxy spowoduje wykonanie reguły somePolicy? Tak jak w przypadku operatora Dopasowania jest w tym przypadku tylko jedna możliwość.
Wywołanie interfejsu API:
GET http://artomatic-test.apigee.net/matchtest/cat
Czy zasada jest wdrażana? Tak, ponieważ sufiks ścieżki serwera proxy pasuje do „/cat
”
dokładnie. Nie uruchomi się, jeśli sufiks to /bat
, /dog
lub cokolwiek
.
Utwórz wyrażenie regularne zawierające symbol „*” kwantyfikator. Ten kwantyfikator odpowiada zeru lub poprzedniego znaku.
<Condition>(proxy.pathsuffix JavaRegex "/c*t")</Condition>
Wywołanie interfejsu API:
GET http://artomatic-test.apigee.net/matchtest/cat
Czy zasada jest wdrażana? Nie! Symbol „*” kwantyfikator pasuje do zero lub większej liczby
poprzedni znak, który jest „c
”.
Wywołanie interfejsu API:
GET http://artomatic-test.apigee.net/matchtest/ccccct
Czy zasada jest wdrażana? Tak, ponieważ symbol wieloznaczny pasuje do 0 lub większej liczby poprzednich znaku.
Następnie używamy kolumny „?
” kwantyfikator, który pasuje do poprzedniego znaku raz lub nie
.
<Condition>(proxy.pathsuffix JavaRegex "/ca?t")</Condition>
Wywołanie interfejsu API:
GET http://artomatic-test.apigee.net/matchtest/cat
Czy zasada jest wdrażana? Tak. „?
” kwantyfikator pasuje do zero lub jednego wystąpienia
poprzedni znak, który jest „a
”.
Wywołanie interfejsu API:
GET http://artomatic-test.apigee.net/matchtest/ct
Czy zasada jest wdrażana? Tak. „?
” kwantyfikator pasuje do jednego lub
brak poprzedniego znaku. W tym przypadku nie ma „a” tak więc makro
zwraca wartość prawda.
Wywołanie interfejsu API:
GET http://artomatic-test.apigee.net/matchtest/caat
Czy zasada jest wdrażana? Nie. Symbol „?” kwantyfikator pasuje do jednego z poprzednich
który jest znakiem „a
”.
Następnie używamy kolumny „[abc]
” lub „grupowanie” stylu wyrażenia regularnego. Pasuje do
znaki „a
” lub „b
” lub „c
”.
<Condition>(proxy.pathsuffix JavaRegex "/[cbr]at")</Condition>
Wywołanie interfejsu API:
GET http://artomatic-test.apigee.net/matchtest/cat
Czy zasada jest wdrażana? Tak. Używamy tu wyrażeń regularnych, a
„[cbr]
” pasuje do „c”, „b” lub „r”. Te połączenia są również dopasowane:
GET http://artomatic-test.apigee.net/matchtest/bat
GET http://artomatic-test.apigee.net/matchtest/rat
Ale to nie pasuje:
GET http://artomatic-test.apigee.net/matchtest/mat
Pytanie: czy w operatorze JavaRegex wielkość liter ma znaczenie?
Tak. Załóżmy, że Twój warunek jest taki:
<Condition>(proxy.pathsuffix JavaRegex "/ca?t")</Condition>
Wywołanie interfejsu API:
GET http://artomatic-test.apigee.net/matchtest/cat
Czy zasada jest wdrażana? Tak. Wyrażenie regularne odpowiada zero lub jednemu z poprzedzających znaków, które jest „a”.
Wywołanie interfejsu API:
GET http://artomatic-test.apigee.net/matchtest/cAt
Pytanie: Czy zasada jest wdrażana?
Nie, ponieważ wielka litera „A” nie pasuje do małych liter.
MatchesPath
Operator MatchesPath
możesz też określić w ten sposób: „~/”. Wygląda trochę jak
Matches
(~) oraz operatory JavaRegex (~~). Ścieżka MatchPath jest jednak zupełnie inna.
Pamiętaj tylko, że ten operator traktuje ścieżkę jako serię części. Dlatego, jeśli ścieżka
jest: /animals/cats/wild
, możesz wyobrazić sobie, że ścieżka składa się z części,
„/animals
”, „/cats
” i „/wild
”.
Operator MatchesPath
pozwala używać dwóch znaków wieloznacznych: jednej gwiazdki (*) i
podwójna gwiazdka (**). Pojedyncza gwiazdka pasuje do jednego elementu ścieżki. Podwójna gwiazdka pasuje do:
jeden lub wiele elementów ścieżki.
Przeanalizujmy poniższy przykład. W tym przykładzie testujemy zmienną proxy.pathsuffix
,
zmienną wbudowaną w Edge, która przechowuje sufiks ścieżki żądania. Pamiętaj jednak, że możesz
testować wartość dowolnej zmiennej przepływu, która zawiera ciąg znaków.
<PreFlow name="PreFlow"> <Request> <Step> <Condition>(proxy.pathsuffix MatchesPath "/animals/*")</Condition> <Name>SomePolicy</Name> </Step> </Request> <Response/> </PreFlow>
Pytanie: który sufiks ścieżki serwera proxy spowoduje wykonanie reguły somePolicy?
Wywołanie interfejsu API:
GET http://artomatic-test.apigee.net/matchtest/animals
Pytanie: Czy zasada jest wdrażana?
Nie, ponieważ warunek wymaga kolejnego elementu ścieżki po
„/animals
”, zgodnie z wartością podaną przez „/*
”.
Wywołanie interfejsu API:
GET http://artomatic-test.apigee.net/matchtest/animals
Czy zasada jest wdrażana? Tak, ścieżka ma inny element ścieżki (część za nim
„/animals/
”), ale jest on pusty.
Wywołanie interfejsu API:
GET http://artomatic-test.apigee.net/matchtest/animals/cats
Czy zasada jest wdrażana? Tak, ponieważ ścieżka wyraźnie zawiera element („/cats
”)
występujący po „/animals
”
Wywołanie interfejsu API:
GET http://artomatic-test.apigee.net/matchtest/animals/cats/wild
Pytanie: Czy zasada jest wdrażana?
Nie, ponieważ pojedyncza gwiazdka pasuje tylko do jednego elementu ścieżki,
ten interfejs API zawiera więcej niż 1 element po „/animals
”.
Teraz użyjmy podwójnej gwiazdki:
<PreFlow name="PreFlow"> <Request> <Step> <Condition>(proxy.pathsuffix MatchesPath "/animals/**")</Condition> <Name>SomePolicy</Name> </Step> </Request> <Response/> </PreFlow>
Pytanie: który sufiks ścieżki serwera proxy spowoduje wykonanie reguły somePolicy?
Wywołanie interfejsu API:
GET http://artomatic-test.apigee.net/matchtest/animals
Czy zasada jest wdrażana? Nie, ponieważ warunek wymaga co najmniej jednego kolejnego elementu ścieżki
określona przez „/**
”.
Wywołanie interfejsu API:
GET http://artomatic-test.apigee.net/matchtest/animals
Czy zasady są wdrażane?
Tak, ścieżka ma inny element ścieżki (część za nim
„/animals/
”), ale jest on pusty.
Wywołanie interfejsu API:
GET http://artomatic-test.apigee.net/matchtest/animals/cats
Czy zasady są wdrażane?
Tak, ponieważ ścieżka zawiera co najmniej jeden element występujący za nim
„/animals
”
Wywołanie interfejsu API:
GET http://artomatic-test.apigee.net/matchtest/animals/cats/wild
Czy zasady są wdrażane?
Tak, ponieważ ścieżka zawiera więcej niż jeden element, który występuje za nim
„/animals
”
Łączenie gwiazdek
Możesz użyć kombinacji gwiazdek pojedynczej (*) i podwójnej (**) w celu dalszego doprecyzowania dopasowania ścieżki.
<PreFlow name="PreFlow"> <Request> <Step> <Condition>(proxy.pathsuffix MatchesPath "/animals/*/wild/**")</Condition> <Name>SomePolicy</Name> </Step> </Request> <Response/> </PreFlow>
Wywołanie interfejsu API:
Wszystkie te wywołania interfejsu API zapewnią dopasowanie:
GET http://artomatic-test.apigee.net/matchtest/animals/cats/wild/
,
oraz
GET http://artomatic-test.apigee.net/matchtest/animals/dogs/wild/austrailian
,
oraz
GET
http://artomatic-test.apigee.net/matchtest/animals/birds/wild/american/finches
Zasoby interfejsu API
Usługi REST to zbiory zasobów interfejsów API. Zasób interfejsu API jest ścieżką identyfikatora URI fragment określający jednostkę, do której programiści mogą uzyskać dostęp za pomocą wywołania interfejsu API. Przykład: jeśli Twoja usługa dostarcza prognozy pogody i prognozy pogody, usługa backendu może określić dwa zasoby API:
- http://mygreatweatherforecast.com/reports
- http://mygreatweatherforecast.com/forecasts
Tworząc serwer proxy interfejsu API (jak pokazano w sekcji Tworzenie pierwszego serwera proxy API), tworzysz przynajmniej alias podstawowy URL mapowany na usługę backendu. Na przykład:
Podstawowy adres URL backendu | Nowy/odpowiednik URL serwera proxy API |
---|---|
http://mygreatweatherforecast.com | http://{your_org}-{environment}.apigee.net/mygreatweatherforecast |
Na tym etapie możesz wykonywać wywołania interfejsu API w backendzie przy użyciu dowolnego podstawowego adresu URL. Jeśli jednak używasz funkcji adresu URL serwera proxy interfejsu API, wszystko zaczyna się robić interesujące.
Oprócz statystyk interfejsu API, które Edge zaczyna zbierać podczas używania serwera proxy API, serwery proxy pozwalają też definiować przepływy warunkowe mapowane na zasoby w backendzie. W skrócie: „Jeśli wywołanie GET jest przekazywane do zasobu /reports, Edge powinien coś zrobić”.
Na ilustracji poniżej przedstawiono różnicę w działaniu dwóch adresów URL, które uzyskują dostęp do z tego samego backendu. Jeden to adres URL zasobu bez serwera proxy, drugi to serwer proxy interfejsu Edge API z z przepływem warunkowym do tego samego zasobu backendu. Przepływy warunkowe zostaną opisane bardziej szczegółowo poniżej.
Jak serwery proxy interfejsów API mapują się na konkretne zasoby backendu
Gdy adres URL serwera proxy interfejsu API jest zmapowany na podstawowy adres URL usługi backendu (podczas tworzenia
proxy), możesz dodać przepływy warunkowe do określonych zasobów, takich jak /reports
i /forecasts
zasobów wspomnianych wcześniej.
Załóżmy, że chcesz, by Edge „zrobił coś” przy połączeniach przychodzących na
/reports
lub /forecasts
zasobu. W tym momencie nie informujesz Edge
co zrobić. Po prostu nasłuchuj połączeń do tych zasobów. Zrób to
warunki. Na serwerze proxy interfejsu Edge API możesz tworzyć przepływy warunkowe dla
/reports
i /forecasts
. Do celów koncepcyjnych poniższy interfejs API
kod XML serwera proxy pokazuje, jak mogą wyglądać te warunki.
<Flows> <Flow name="reports"> <Description/> <Request/> <Response/> <Condition>(proxy.pathsuffix MatchesPath "/reports") and (request.verb = "GET")</Condition> </Flow> <Flow name="forecasts"> <Description/> <Request/> <Response/> <Condition>(proxy.pathsuffix MatchesPath "/forecasts") and (request.verb = "GET")</Condition> </Flow> </Flows>
Warunki te mają postać „Gdy przychodzi żądanie GET z /reports
i
/forecasts
w adresie URL, Edge wykona to, co poprosi Cię (deweloper interfejsu API)
przez zasady dołączane do tych procesów.
Oto przykład, który informuje Edge o tym, co ma zrobić, gdy zostanie spełniony warunek. W poniższym interfejsie API
XML serwera proxy, gdy żądanie GET jest wysyłane do
https://yourorg-test.apigee.net/mygreatweatherforecast/reports
, Edge jest wykonywany
„XML-to-JSON-1” zasady w odpowiedzi.
<Flows> <Flow name="reports"> <Description/> <Request/> <Response> <Step> <Name>XML-to-JSON-1</Name> </Step> </Response> <Condition>(proxy.pathsuffix MatchesPath "/reports") and (request.verb = "GET")</Condition> </Flow>
Oprócz tych opcjonalnych przepływów warunkowych każdy serwer proxy interfejsu API ma również dwa domyślne
przepływy: <PreFlow>
wykonany przed przepływami warunkowymi,
Metoda <PostFlow>
została wykonana po przepływach warunkowych. Przydają się one:
podczas wykonywania zasad w przypadku dowolnego wywołania serwera proxy interfejsu API. Jeśli chcesz na przykład
klucza interfejsu API aplikacji musisz weryfikować przy każdym wywołaniu niezależnie od używanego zasobu backendu
może umieścić zasadę weryfikacji klucza interfejsu API w <PreFlow>
. Więcej informacji o przepływach:
Konfigurowanie przepływów.
Tworzenie przepływów warunkowych do zasobów backendu
Definiowanie przepływów warunkowych do zasobów backendu na serwerze proxy interfejsu API jest całkowicie opcjonalne. Takie procesy warunkowe dają jednak możliwość szczegółowego zarządzania i monitorowania.
Dzięki niemu:
- Stosuj zarządzanie w sposób odzwierciedlający semantykę modelu interfejsu API
- Stosowanie zasad i zachowań skryptów do poszczególnych ścieżek zasobów (identyfikatorów URI)
- Zbieranie szczegółowych danych na potrzeby usług Analytics
Na przykład wyobraź sobie, że musisz zastosować różne typy logiki do backendu /developers do zasobów /apps.
Aby to zrobić, dodaj 2 przepływy warunkowe na serwerze proxy API: /developers
oraz
/apps
W widoku Programowanie w panelu Nawigator edytora serwera proxy interfejsów API kliknij ikonę +. obok wartości domyślnej w punktach końcowych serwera proxy.
W sekcji „Nowy przepływ warunkowy” wpisz następujące konfiguracje kluczy:
- Nazwa przepływu: Deweloperzy
- Typ warunku: Ścieżka
- Ścieżka: /developers
Warunek zostanie aktywowany (i zasady zostaną wykonane), jeśli wywołanie zostanie wysłane do serwera proxy z /developers na końcu identyfikatora URI.
Teraz dodaj przepływ warunkowy dla /apps i załóżmy, że chcesz, aby warunek był wywoływany identyfikator URI i czasownik POST w żądaniu. Konfiguracja obejmuje ustawienie :
- Flow Name (Nazwa przepływu): Aplikacje
- Typ warunku: Ścieżka i Czasownik
- Ścieżka: /apps
- Czasownik: POST
Warunek zostanie aktywowany (i zasady zostaną wykonane), jeśli wywołanie zostanie wysłane do serwera proxy z /apps na końcu identyfikatora URI i z czasownikiem POST.
W panelu Nawigator zobaczysz nowe przepływy dla aplikacji i Deweloperzy.
Wybierz jeden z przepływów, aby wyświetlić konfigurację przepływu warunkowego w edytorze serwera proxy interfejsu API widok kodu:
<Flow name="Apps"> <Description>Developer apps registered in Developer Services</Description> <Request/> <Response/> <Condition>(proxy.pathsuffix MatchesPath "/apps") and (request.verb = "POST")</Condition> </Flow>
Jak widać, zasoby interfejsu API są po prostu przepływami warunkowymi, które oceniają ścieżkę URI ścieżki dostępu żądania przychodzącego. (Zmienna proxy.pathsuffix identyfikuje identyfikator URI żądania, które następuje po ścieżki BasePath skonfigurowanej w konfiguracji ProxyEndpoint).
Każdy zdefiniowany zasób API jest zaimplementowany przez przepływ warunkowy na serwerze proxy API. (Zobacz Konfigurowanie przepływów).
Po wdrożeniu serwera proxy interfejsu API w środowisku testowym to żądanie:
http://{org_name}-test.apigee.net/{proxy_path}/apps
spowoduje, że warunek zostanie oceniony jako prawda, a ten przepływ, a także wszystkie powiązane będą wdrażane.
W poniższym przykładowym warunku użyto wyrażenia regularnego Javy do rozpoznawania wywołań funkcji
/apps
zasób z ukośnikiem na końcu lub bez niego (/apps
lub
/apps/**
):
<Condition>(proxy.pathsuffix JavaRegex "/apps(/?)") and (request.verb = "POST")</Condition>
Więcej informacji o tym typie warunku znajdziesz w artykule Jak dopasować niezależnie ... w Społeczności Apigee.
Modelowanie hierarchicznych identyfikatorów URI
W niektórych przypadkach będziesz mieć zasoby hierarchicznego interfejsu API. Na przykład Usługi dla deweloperów Interfejs API udostępnia metodę wyświetlania listy wszystkich aplikacji należących do dewelopera. Ścieżka identyfikatora URI to:
/developers/{developer_email}/apps
Mogą istnieć zasoby, w których dla każdego elementu w kolekcji generowany jest unikalny identyfikator, który jest czasami oznaczany w taki sposób:
/genus/:id/species
Ta ścieżka dotyczy w równym stopniu tych dwóch identyfikatorów URI:
/genus/18904/species /genus/17908/species
Aby przedstawić tę strukturę w zasobie interfejsu API, możesz użyć symboli wieloznacznych. Na przykład:
/developers/*/apps
/developers/*example.com/apps
/genus/*/species
poprawnie rozpozna te hierarchiczne identyfikatory URI jako zasoby interfejsu API.
W niektórych przypadkach zwłaszcza w przypadku bardzo hierarchicznych interfejsów API, najlepiej będzie po prostu rozwiązywać wszystkie problemy, które są danego fragmentu identyfikatora URI. Aby to zrobić, w definicji zasobu użyj symbolu wieloznacznego z podwójną gwiazdką. Dla: możesz na przykład zdefiniować następujący zasób interfejsu API:/developers/**
Ten zasób interfejsu API rozpozna następujące ścieżki identyfikatora URI:
/developers/{developer_email}/apps /developers/{developer_email}/keys /developers/{developer_email}/apps/{app_id}/keys
Tak wyglądałby warunek warunkowego przepływu w definicji serwera proxy interfejsu API:
<Condition>(proxy.pathsuffix MatchesPath "/developers/**") and (request.verb = "POST")</Condition>
Więcej przykładów
Warunek dołączony do reguły routingu
<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>
Warunek dołączony do zasady
<Step> <!--the policy MaintenancePolicy only executes if the response status code is exactly 503--> <Condition>response.status.code = 503</Condition> <Name>MaintenancePolicy</Name> </Step>
Przepływ warunkowy
<!-- this entire flow is executed only if the request verb is a GET--> <Flow name="GetRequests"> <Condition>request.verb="GET"</Condition> <Request> <Step> <!-- this policy only executes if request path includes a term like statues--> <Condition>request.path ~ "/statuses/**"</Condition> <Name>StatusesRequestPolicy</Name> </Step> </Request> <Response> <Step> <!-- this condition has multiple expressions. The policy executes if the response code status is exactly 503 or 400--> <Condition>(response.status.code = 503) or (response.status.code = 400)</Condition> <Name>MaintenancePolicy</Name> </Step> </Response> </Flow>
Przykładowe operatory w warunkach
Oto kilka przykładów operatorów używanych do tworzenia warunków:
request.header.content-type = "text/xml"
request.header.content-length < 4096 && request.verb = "PUT"
response.status.code = 404 || response.status.code = 500
request.uri MatchesPath "/*/statuses/**"
request.queryparam.q0 NotEquals 10
Praktyczny przykład: Ignoruj znak „/” w koniec ścieżki
Deweloperzy brzegowi często chcą obsługiwać oba te sufiksy ścieżek: „/cat
” oraz
„/cat/
”. Dzieje się tak, ponieważ niektórzy użytkownicy lub klienci mogą wywoływać interfejs API z dodatkowym
na końcu ścieżki. Musisz być w stanie obsłużyć to w argumencie
wyciągów. Dokładny przypadek użycia:
zostało omówione w społeczności Apigee.
Możesz to zrobić bez użycia wyrażenia regularnego w ten sposób:
<PreFlow name="PreFlow"> <Request> <Step> <Condition>((proxy.pathsuffix = "/cat") OR (proxy.pathsuffix = "/cat/")</Condition> <Name>SomePolicy</Name> </Step> </Request> <Response/> </PreFlow>
To dobra opcja. Jest zrozumiałe i czytelne.
To samo możesz zrobić w przypadku wyrażenia regularnego, ale w ten sposób. Nawiasy są używane do grupowania wyrażenia regularnego, ale nie są one wymagane.
<Condition>(proxy.pathsuffix JavaRegex "/cat(/?)"</Condition>
Wywołania interfejsu API:
GET http://artomatic-test.apigee.net/matchtest/cat
,
or
GET http://artomatic-test.apigee.net/matchtest/cat
/
Czy zasada jest wdrażana? Tak. Zwróć uwagę, że w wyrażeniu regularnym parametr „?
”
znak oznacza: dopasowanie zero lub jednego z poprzedzających znaków. Obie funkcje
„/cat
” i „/cat/
” dopasowania.
Wywołanie interfejsu API:
GET http://artomatic-test.apigee.net/matchtest/cat/spotted
Czy zasada jest wdrażana? Nie. Wyrażenie regularne odpowiada zero lub tylko jednemu wystąpieniu poprzedzający ten znak i nic nie jest dozwolone.
Dopasowywanie dowolnych ciągów znaków za pomocą JavaRegex
We wszystkich przykładach w tym temacie pokazujemy, jak dopasować jedną z wbudowanych zmiennych przepływu: proxy.pathsuffix. Warto wiedzieć, że dopasowywanie do wzorca można zastosować w przypadku dowolnego ciągu niezależnie od tego, czy jest to wbudowana zmienna przepływu, np. proxy.pathsuffix.
Jeśli na przykład warunek, który testuje dowolny ciąg znaków, w ładunku backendu lub ciągu znaków zwróconego podczas wyszukiwania serwera uwierzytelniania, możesz użyć funkcji i operatorów wyszukiwania. Jeśli używasz języka JavaRegex, wyrażenie regularne zostanie porównane względem całego ciągu tematu. Jeśli temat to „abc” a wyrażenie regularne to „[a-z]”, brak dopasowań, ponieważ „[a-z]” pasuje dokładnie jeden znak alfa. wyrażenie „[a-z]+” oraz „[a-z]*” i „[a-z]{3}.
Spójrzmy na konkretny przykład. Załóżmy, że serwer uwierzytelniania zwraca listę ról jako ciąg oddzielony przecinkami: „redaktor, autor, gość”.
Aby przetestować obecność roli edytującego, ta konstrukcja nie zadziała, ponieważ „Edytujący” to tylko część całego ciągu.
<Condition>returned_roles ~~ "editor"</Condition>
Taka konstrukcja będzie jednak działać:
<Condition>returned_roles ~~ ".*\beditor\b.*")</Condition>
Działa, ponieważ uwzględnia podziały słów i inne części ciągu znaków ze znakiem .* przedrostkiem i sufiksem.
W tym przykładzie możesz też przetestować działanie funkcji „editor” z operatorem Dopasowania:
<Condition>returned_roles ~~ "*editor*")</Condition>
Jeśli jednak potrzebujesz większej precyzji, JavaRegex jest często lepszym rozwiązaniem.
Zmiana znaczenia podwójnych cudzysłowów w wyrażeniach JavaRegex
Składnia warunku wymaga zastosowania wyrażenia JavaRegex w cudzysłowach podwójnych. dlatego, jeśli masz Wyrażenie regularne zawiera cudzysłowy podwójne, ale musisz użyć innego sposobu ich dopasowania. Odpowiedź brzmi: Unicode. Załóżmy na przykład, że przekazujesz nagłówek zawierający podwójny cudzysłów, jak w poniższym przykładzie:-H 'content-type:multipart/related; type="application/xop+xml"'
request.header.Content-Type ~~ "(multipart\/related)(; *type="application\/xop\+xml\")"
\u0022
. Przykład:
następujące wyrażenie jest prawidłowe i zwraca oczekiwany wynik:
request.header.Content-Type ~~ "(multipart\/related)(; *type=\u0022application\/xop\+xml\u0022)"