Wyświetlasz dokumentację Apigee Edge.
Otwórz dokumentację
Apigee X. info
Z tego artykułu dowiesz się, jak utworzyć mashup przy użyciu kompozycji zasad. Kompozycja zasad to wzorzec proxy Apigee, który umożliwia łączenie wyników z wielu docelowych backendów w jedną odpowiedź za pomocą zasad.
Ogólny przegląd kompozycji zasad znajdziesz w artykule "Wzorzec kompozycji zasad" w Wzorce w książce kucharskiej dotyczącej proxy interfejsów API.
Pobieranie i wypróbowywanie przykładowego kodu
Informacje o tym przykładzie z książki kucharskiej
Ten przykład z książki kucharskiej ilustruje wzorzec proxy interfejsu API o nazwie kompozycja zasad. Ten wzorzec to jeden ze sposobów (jest ich więcej) na łączenie danych z wielu źródeł backendu. Ogólnie rzecz biorąc, ten artykuł pokazuje, jak można łączyć i łączyć ze sobą zasady, aby uzyskać pożądany efekt. Ogólny przegląd tego wzorca i innych powiązanych wzorców znajdziesz w artykule Wzorce w książce kucharskiej dotyczącej proxy interfejsów API.
W omawianym tu przykładzie kompozycja zasad służy do łączenia danych z tych 2 oddzielnych publicznych interfejsów API:
- Google Geocoding API: ten interfejs API przekształca adresy (np. „1600 Amphitheatre Parkway, Mountain View, CA”) na współrzędne geograficzne (np. szerokość geograficzna 37.423021 i długość geograficzna -122.083739).
- Google Elevation API: ten interfejs API udostępnia prosty interfejs do wysyłania zapytań o dane dotyczące wysokości w różnych miejscach na świecie. W tym przykładzie współrzędne zwrócone przez Geocoding API będą używane jako dane wejściowe tego interfejsu API.

Deweloperzy aplikacji będą wywoływać ten proxy interfejsu API za pomocą 2 parametrów zapytania: kodu pocztowego i identyfikatora kraju :
$ curl "http://{myorg}-test.apigee.net/policy-mashup-cookbook?country=us&postalcode=08008"
Odpowiedź to obiekt JSON, który zawiera geokodowaną lokalizację (szerokość i długość geograficzną) środka podanego obszaru kodu pocztowego oraz wysokość w tej geokodowanej lokalizacji.
{
"ElevationResponse":{
"status":"OK",
"result":{
"location":{
"lat":"39.7500713",
"lng":"-74.1357407"
},
"elevation":"0.5045232",
"resolution":"76.3516159"
}
}
}Zanim zaczniesz
Jeśli chcesz przeczytać krótki przegląd wzorca kompozycji zasad, zapoznaj się z artykułem „Wzorzec kompozycji zasad” w sekcji Wzorce w książce kucharskiej dotyczącej proxy interfejsów API.
Zanim zapoznasz się z tym przykładem z książki kucharskiej, musisz też znać te podstawowe pojęcia:
- Czym są zasady i jak je dołączać do proxy. Więcej informacji o zasadach znajdziesz w artykule Co to są zasady?.
- Struktura przepływu proxy interfejsu API, jak opisano w artykule Konfigurowanie przepływów. Przepływy umożliwiają określanie kolejności wykonywania zasad przez proxy interfejsu API. W tym przykładzie tworzymy kilka zasad i dodajemy je do przepływu proxy interfejsu API.
- Sposób organizacji projektu proxy interfejsu API w systemie plików, jak opisano w Dokumentacja konfiguracji proxy interfejsu API. Ten artykuł z książki kucharskiej opisuje tworzenie lokalne (oparte na systemie plików) a nie tworzenie w chmurze, w którym można używać interfejsu zarządzania do tworzenia proxy interfejsu API.
- Użycie weryfikacji klucza interfejsu API. Jest to najprostsza forma zabezpieczeń opartych na aplikacji, którą można skonfigurować w przypadku interfejsu API. Więcej informacji znajdziesz w artykule Klucze interfejsu API. Możesz też przejść przez samouczek Zabezpieczanie interfejsu API przez wymaganie kluczy interfejsu API.
- Praktyczna znajomość języka XML. W tym przykładzie tworzymy proxy interfejsu API i jego zasady za pomocą plików XML znajdujących się w systemie plików.
Jeśli masz pobrany przykładowy kod, wszystkie pliki omówione w tym artykule znajdziesz w folderze mashup-policy-cookbook. W kolejnych sekcjach szczegółowo omówimy przykładowy kod.
Przepływ
Zanim przejdziemy do zasad, przyjrzyjmy się głównemu przepływowi naszego przykładowego proxy interfejsu API. Poniższy kod XML przepływu zawiera wiele informacji o tym proxy, używanych przez nie zasadach i miejscach, w których te zasady są wywoływane.
W pobranym przykładzie ten kod XML znajdziesz w pliku
doc-samples/policy-mashup-cookbook/apiproxy/proxies/default.xml.
<ProxyEndpoint name="default"> <Flows> <Flow name="default"> <Request> <!-- Generate request message for the Google Geocoding API --> <Step><Name>GenerateGeocodingRequest</Name></Step> <!-- Call the Google Geocoding API --> <Step><Name>ExecuteGeocodingRequest</Name></Step> <!-- Parse the response and set variables --> <Step><Name>ParseGeocodingResponse</Name></Step> <!-- Generate request message for the Google Elevation API --> <Step><Name>AssignElevationParameters</Name></Step> </Request> <Response> <!-- Parse the response message from the Elevation API --> <Step><Name>ParseElevationResponse</Name></Step> <!-- Generate the final JSON-formatted response with JavaScript --> <Step><Name>GenerateResponse</Name></Step> </Response> </Flow> </Flows> <HTTPProxyConnection> <!-- Add a base path to the ProxyEndpoint for URI pattern matching--> <BasePath>/policy-mashup-cookbook</BasePath> <!-- Listen on both HTTP and HTTPS endpoints --> <VirtualHost>default</VirtualHost> <VirtualHost>secure</VirtualHost> </HTTPProxyConnection> <RouteRule name="default"> <!-- Connect ProxyEndpoint to named TargetEndpoint under /targets --> <TargetEndpoint>default</TargetEndpoint> </RouteRule> </ProxyEndpoint>
Oto podsumowanie elementów przepływu.
- <Request> – element <Request> składa się z kilku elementów <Step>. Każdy krok wywołuje jedną z zasad, które utworzymy w dalszej części tego artykułu. Te zasady służą do tworzenia wiadomości z żądaniem, wysyłania jej i analizowania odpowiedzi. Po przeczytaniu tego artykułu zrozumiesz rolę każdej z tych zasad.
- <Response> – element <Response> też zawiera <Steps>. Te kroki też wywołują zasady, które odpowiadają za przetwarzanie ostatecznej odpowiedzi z docelowego punktu końcowego (Google Elevation API).
- <HttpProxyConnection> – ten element określa szczegóły dotyczące sposobu łączenia się aplikacji z tym proxy interfejsu API, w tym <BasePath>, który określa sposób wywoływania tego interfejsu API.
- <RouteRule> – ten element określa, co się dzieje bezpośrednio po przetworzeniu przychodzących wiadomości z żądaniem. W tym przypadku wywoływany jest TargetEndpoint. Więcej informacji o tym ważnym kroku znajdziesz w dalszej części tego artykułu.
Tworzenie zasad
W kolejnych sekcjach omówimy każdą z zasad, które składają się na ten przykład kompozycji zasad.
Tworzenie pierwszej zasady AssignMessage policy
Pierwsza zasada AssignMessage, wymieniona poniżej, tworzy wiadomość z żądaniem, która zostanie wysłana do usługi Google Geocoding service.

Zacznijmy od kodu zasady, a potem omówimy jej elementy bardziej szczegółowo. W pobranym przykładzie ten kod XML znajdziesz w pliku
doc-samples/policy-mashup-cookbook/apiproxy/policies/GenerateGeocodingRequest.xml.
<AssignMessage name="GenerateGeocodingRequest"> <AssignTo createNew="true" type="request">GeocodingRequest</AssignTo> <Set> <QueryParams> <QueryParam name="address">{request.queryparam.postalcode}</QueryParam> <QueryParam name="region">{request.queryparam.country}</QueryParam> <QueryParam name="sensor">false</QueryParam> </QueryParams> <Verb>GET</Verb> </Set> <!-- Set variables for use in the final response --> <AssignVariable> <Name>PostalCode</Name> <Ref>request.queryparam.postalcode</Ref> </AssignVariable> <AssignVariable> <Name>Country</Name> <Ref>request.queryparam.country</Ref> </AssignVariable> </AssignMessage>
Oto krótki opis elementów tej zasady. Więcej informacji o tej zasadzie znajdziesz w artykule Zasada Assign Message.
- <AssignMessage name> – nadaje tej zasadzie nazwę. Nazwa jest używana, gdy zasada jest przywoływana w przepływie.
- <AssignTo> – tworzy nazwaną zmienną o nazwie GeocodingRequest. Ta zmienna zawiera obiekt żądania, który zostanie wysłany do backendu przez zasadę ServiceCallout.
- <QueryParams> – ustawia parametry zapytania, które są potrzebne do wywołania interfejsu API backendu. W tym przypadku Geocoding API musi znać lokalizację, która jest
wyrażona za pomocą kodu pocztowego i identyfikatora kraju. Użytkownik aplikacji podaje te informacje, a
my po prostu je tutaj wyodrębniamy. Parametr
sensorjest wymagany przez interfejs API i może mieć wartość true lub false. W tym przypadku ustawiamy go na stałe na false. - <Verb> – w tym przypadku wysyłamy proste żądanie GET do interfejsu API.
- <AssignVariable> – te zmienne przechowują wartości, które przekazujemy do interfejsu API. W tym przykładzie zmienne będą dostępne później w odpowiedzi zwróconej do klienta.
Wysyłanie żądania za pomocą ServiceCallout
Następnym krokiem w sekwencji kompozycji zasad jest utworzenie zasady ServiceCallout. Zasada ServiceCallout, wymieniona poniżej, wysyła obiekt żądania utworzony w poprzedniej zasadzie AssignMessage do usługi Google Geocoding i zapisuje wynik w zmiennej o nazwie GeocodingResponse.

Jak poprzednio, najpierw przyjrzyjmy się kodowi. Następnie podamy szczegółowe wyjaśnienie. Więcej informacji o tej zasadzie znajdziesz w artykule Zasada Service Callout. W pobranym przykładzie ten kod XML znajdziesz w pliku
doc-samples/policy-mashup-cookbook/apiproxy/policies/ExecuteGeocodingRequest.xml.
<ServiceCallout name="ExecuteGeocodingRequest"> <Request variable="GeocodingRequest"/> <Response>GeocodingResponse</Response> <HTTPTargetConnection> <URL>http://maps.googleapis.com/maps/api/geocode/json</URL> </HTTPTargetConnection> </ServiceCallout>
Oto krótki opis elementów tej zasady.
- <ServiceCallout> – podobnie jak poprzednia zasada, ta też ma nazwę.
- <Request variable> – jest to zmienna utworzona w zasadzie AssignMessage. Zawiera ona żądanie wysyłane do interfejsu API backendu.
- <Response> – ten element określa nazwę zmiennej, w której jest przechowywana odpowiedź. Jak zobaczysz, ta zmienna będzie później dostępna dla zasady ExtractVariables policy.
- <HTTPTargetConnection> – określa docelowy adres URL interfejsu API backendu API. W tym przypadku określamy, że interfejs API ma zwracać odpowiedź w formacie JSON.
Mamy teraz 2 zasady: pierwsza określa informacje o żądaniu potrzebne do korzystania z interfejsu API backendu (Google Geocoding API), a druga wysyła żądanie do interfejsu API backendu. Następnie zajmiemy się odpowiedzią.
Analizowanie odpowiedzi za pomocą ExtractVariables
Zasada ExtractVariables udostępnia prosty mechanizm analizowania treści z wiadomości z odpowiedzią uzyskaną przez zasadę ServiceCallout. Zasady ExtractVariables można używać do analizowania formatu JSON lub XML albo do wyodrębniania treści ze ścieżek URI, nagłówków HTTP, parametrów zapytania i parametrów formularza.

Oto lista zasad ExtractVariables. Więcej informacji o tej zasadzie znajdziesz w artykule
Zasada Extract Variables
policy. W pobranym przykładzie ten kod XML znajdziesz w pliku
doc-samples/policy-mashup-cookbook/apiproxy/policies/ParseGeocodingResponse.xml.
<ExtractVariables name="ParseGeocodingResponse"> <Source>GeocodingResponse</Source> <VariablePrefix>geocoderesponse</VariablePrefix> <JSONPayload> <Variable name="latitude"> <JSONPath>$.results[0].geometry.location.lat</JSONPath> </Variable> <Variable name="longitude"> <JSONPath>$.results[0].geometry.location.lng</JSONPath> </Variable> </JSONPayload> </ExtractVariables>
Kluczowe elementy zasady ExtractVariable to:
- <ExtractVariables name> – nazwa zasady jest używana do odwoływania się do niej w przepływie.
- <Source> – określa zmienną odpowiedzi utworzoną w zasadzie ServiceCallout. Jest to zmienna, z której ta zasada wyodrębnia dane.
- <VariablePrefix> – prefiks zmiennej określa przestrzeń nazw dla innych zmiennych utworzonych w tej zasadzie. Prefiks może mieć dowolną nazwę, z wyjątkiem nazw zastrzeżonych zdefiniowanych przez predefiniowane zmienne Edge.
- <JSONPayload> – ten element pobiera dane odpowiedzi, które nas interesują, i umieszcza je w nazwanych zmiennych. W rzeczywistości Geocoding API zwraca znacznie więcej informacji niż szerokość i długość geograficzna. Jednak w tym przykładzie potrzebujemy tylko tych wartości. Pełną wersję JSON zwróconego przez Geocoding API znajdziesz w dokumentacji interfejsu API. Wartości geometry.location.lat i geometry.location.lng to tylko 2 z wielu pól w zwróconym obiekcie JSON.
Może to nie być oczywiste, ale ważne jest, aby zobaczyć, że ExtractVariables tworzy 2 zmienne, których nazwy składają się z prefiksu zmiennej (geocoderesponse) i rzeczywistych nazw zmiennych określonych w zasadzie. Te zmienne są przechowywane w proxy interfejsu API i będą dostępne dla innych zasad w przepływie proxy, jak zobaczysz. Zmienne to:
- geocoderesponse.latitude
- geocoderesponse.longitude
Większość pracy jest już wykonana. Utworzyliśmy kompozycję 3 zasad, które tworzą żądanie, wywołują interfejs API backendu i analizują zwrócone dane JSON. W ostatnich krokach przekierujemy dane z tej części przepływu do innej zasady AssignMessage, wywołamy drugi interfejs API backendu (Google Elevation API) i zwrócimy połączone dane do dewelopera aplikacji.
Generowanie drugiego żądania za pomocą AssignMessage
Poniższa zasada AssignMessage używa zmiennych zwróconych z pierwszego backendu (Google Geocoding), które zostały przez nas zapisane, i umieszcza je w żądaniu przeznaczonym dla drugiego interfejsu API (Google Elevation). Jak wspomnieliśmy wcześniej, te zmienne to geocoderesponse.latitude i geocoderesponse.longitude.
W pobranym przykładzie ten kod XML znajdziesz w pliku
doc-samples/policy-mashup-cookbook/apiproxy/policies/AssignElevationParameters.xml.
<AssignMessage name="AssignElevationParameters">
<Remove>
<QueryParams>
<QueryParam name="country"/>
<QueryParam name="postalcode"/>
</QueryParams>
</Remove>
<Set>
<QueryParams>
<QueryParam name="locations">{geocoderesponse.latitude},{geocoderesponse.longitude}</QueryParam>
<QueryParam name="sensor">false</QueryParam>
</QueryParams>
</Set>
</AssignMessage>Jeśli sprawdzisz Google Elevation API, zobaczysz, że przyjmuje on 2 parametry zapytania.
Pierwszy z nich to locations, a jego wartość to szerokość i długość geograficzna
(wartości rozdzielone przecinkami). Drugi parametr to sensor, który jest wymagany i musi
mieć wartość true lub false. W tym momencie najważniejsze jest, aby pamiętać, że utworzona tutaj wiadomość z żądaniem
nie wymaga ServiceCallout. W tym momencie nie musimy wywoływać drugiego
interfejsu API z ServiceCallout, ponieważ możemy wywołać interfejs API backendu z TargetEndpoint proxy. Jeśli się zastanowisz, mamy wszystkie dane potrzebne do wywołania Google Elevations
API. Wiadomość z żądaniem wygenerowana w tym kroku nie wymaga ServiceCallout, ponieważ
żądanie wygenerowane dla głównego potoku żądań zostanie po prostu przekazane przez
ProxyEndpoint do TargetEndpoint zgodnie z regułą RouteRule skonfigurowaną dla tego proxy interfejsu API.
TargetEndpoint zarządza połączeniem ze zdalnym interfejsem API. (Pamiętaj, że adres URL interfejsu
Elevation API jest zdefiniowany w HTTPConnection dla TargetEndpoint. Dokumentacja Elevation API
, jeśli chcesz dowiedzieć się więcej. Parametry QueryParams, które zostały wcześniej zapisane,
country i postalcode, nie są już potrzebne, więc je usuwamy
tutaj.
Krótka przerwa: powrót do przepływu
W tym momencie możesz się zastanawiać, dlaczego nie tworzymy kolejnej zasady ServiceCallout. W końcu
utworzyliśmy kolejną wiadomość. Jak ta wiadomość jest wysyłana do celu, czyli Google
Elevation API? Odpowiedź znajduje się w elemencie <RouteRule> przepływu. <RouteRule>
określa, co zrobić z pozostałymi wiadomościami z żądaniem po wykonaniu części <Request> przepływu. TargetEndpoint określony przez ten element <RouteRule> informuje
proxy interfejsu API, aby dostarczył wiadomość
do http://maps.googleapis.com/maps/api/elevation/xml.
Jeśli masz pobrany przykładowy proxy interfejsu API, kod XML TargetProxy znajdziesz w pliku
doc-samples/policy-mashup-cookbook/apiproxy/targets/default.xml.
<TargetEndpoint name="default"> <HTTPTargetConnection> <!-- This is where we define the target. For this sample we just use a simple URL. --> <URL>http://maps.googleapis.com/maps/api/elevation/xml</URL> </HTTPTargetConnection> </TargetEndpoint>
Teraz musimy tylko przetworzyć odpowiedź z Google Elevation API i gotowe.
Konwertowanie odpowiedzi z XML na JSON
W tym przykładzie odpowiedź z Google Elevation API jest zwracana w formacie XML. Aby uzyskać "dodatkowe punkty", dodajmy do naszej kompozycji jeszcze jedną zasadę, która przekształci odpowiedź z XML na JSON.
Ten przykład używa zasady JavaScript o nazwie GenerateResponse z plikiem zasobu zawierającym kod JavaScript do przeprowadzenia konwersji. Poniżej znajdziesz definicję zasady GenerateResponse:
<Javascript name="GenerateResponse" timeout="10000"> <ResourceURL>jsc://GenerateResponse.js</ResourceURL> </Javascript>
Plik zasobu GenerateResponse.js zawiera kod JavaScript używany do przeprowadzenia
konwersji. Ten kod znajdziesz w
pliku doc-samples/policy-mashup-cookbook/apiproxy/resources/JSC/GenerateResponse.js.
Apigee udostępnia też gotową zasadę XMLToJSON, która służy do konwertowania XML na JSON. Możesz
edytować ProxyEndpoint, aby zamiast tego używać zasady xmltojson pokazanej poniżej.
<XMLToJSON name="xmltojson"> <Options> </Options> <OutputVariable>response</OutputVariable> <Source>response</Source> </XMLToJSON>
Testowanie przykładu
Jeśli jeszcze tego nie zrobisz, spróbuj pobrać, wdrożyć i uruchomić policy-mashup-cookbook przykład, który znajdziesz w folderze doc-samples w repozytorium przykładów Apigee Edge na GitHubie. Postępuj zgodnie z instrukcjami w pliku README w folderze policy-mashup-cookbook. Możesz też skorzystać z krótkich instrukcji tutaj: Korzystanie z przykładowych proxy interfejsów API.
Podsumowując, możesz wywołać złożony interfejs API w ten sposób. Zastąp {myorg} nazwą swojej organizacji:
$ curl "http://{myorg}-test.apigee.net/policy-mashup-cookbook?country=us&postalcode=08008"
Odpowiedź zawiera geokodowaną lokalizację środka kodu pocztowego podanego przez użytkownika aplikacji oraz wysokość w tej geokodowanej lokalizacji. Dane zostały pobrane z 2 interfejsów API backendu, połączone za pomocą zasad dołączonych do proxy interfejsu API i zwrócone do klienta w jednej odpowiedzi.
{ "country":"us", "postalcode":"08008", "elevation":{ "meters":0.5045232, "feet":1.6552599030345978 }, "location":{ "latitude":39.75007129999999, "longitude":-74.1357407 } }
Podsumowanie
Z tego artykułu dowiesz się, jak używać wzorca kompozycji zasad do tworzenia mashupu danych z wielu źródeł backendu. Kompozycja zasad to powszechny wzorzec używany podczas tworzenia proxy interfejsu API do dodawania kreatywnych funkcji do interfejsu API.