Korzystanie z kompozycji zasad

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:

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 sensor jest 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.