Korzystanie z kompozycji zasad

Przeglądasz dokumentację Apigee Edge.
Otwórz dokumentację Apigee X.
Informacje

Z tej części dowiesz się, jak utworzyć witrynę mashup, korzystając z kompozycji zasad. Kompozycja zasad to wzorzec serwera proxy Apigee, który umożliwia łączenie wyników z wielu celów backendu w jedną odpowiedź przy użyciu zasad.

Ogólne informacje o strukturze zasad znajdziesz w sekcji „Wzorzec struktury zasad” we wzorcach książki kucharskiej serwera proxy interfejsu API.

Pobierz i wypróbuj przykładowy kod

Informacje o książce kucharskiej

Ten przykład książki kucharskiej pokazuje wzorzec serwera proxy interfejsu API o nazwie kompozycja zasad. Wzorzec ten zapewnia jeden ze sposobów łączenia danych z wielu źródeł backendu. Ogólnie rzecz biorąc, ten temat pokazuje, jak można łączyć i łączyć zasady w celu osiągnięcia pożądanego rezultatu. Ogólne informacje na temat tego i innych powiązanych wzorców znajdziesz w artykule Wzorce książki kucharskiej serwera proxy interfejsu API.

W podanym tutaj przykładzie użyto struktury zasad do połączenia danych z tych 2 oddzielnych publicznych interfejsów API:

  • Google Geocoding API: ten interfejs konwertuje adresy (np. „1600 Amphitheatre Parkway, Mountain View, CA”) na współrzędne geograficzne (np. szerokość 37.423021 i długość geograficzną -122.083739).
  • Interfejs Google Elevation API Ten interfejs API ma prosty interfejs do wysyłania zapytań o dane wysokościowe do lokalizacji na Ziemi. W tym przykładzie współrzędne zwrócone z interfejsu Geocoding API zostaną użyte jako dane wejściowe do tego interfejsu API.

Deweloperzy aplikacji będą wywoływać ten serwer proxy interfejsu API, podając 2 parametry zapytania, kod pocztowy i identyfikator kraju:

$ curl "http://{myorg}-test.apigee.net/policy-mashup-cookbook?country=us&postalcode=08008"

Odpowiedź jest obiektem JSON zawierającym geokodowaną lokalizację (szerokość/długość geograficzną) pośrodku obszaru podanego kodu pocztowego oraz wysokość w tej lokalizacji geograficznej.

{  
   "ElevationResponse":{  
      "status":"OK",
      "result":{  
         "location":{  
            "lat":"39.7500713",
            "lng":"-74.1357407"
         },
         "elevation":"0.5045232",
         "resolution":"76.3516159"
      }
   }
}

Zanim zaczniesz

Jeśli chcesz zapoznać się z krótkim omówieniem wzorca struktury zasad, zapoznaj się z sekcją „Wzorzec struktury zasad” we wzorcach książki kucharskiej serwera proxy interfejsu API.

Zanim zapoznasz się z przykładem z książki kucharskiej, zapoznaj się z podstawowymi pojęciami:

  • Czym są zasady i jak podłączyć je do serwerów proxy. Szczegółowe informacje o zasadach znajdziesz w artykule Czym jest zasada?
  • Struktura przepływu pracy serwera proxy interfejsu API została opisana w sekcji Konfigurowanie przepływów. Przepływy pozwalają określić kolejność wykonywania zasad przez serwer proxy interfejsu API. W tym przykładzie tworzymy kilka zasad i dodaje się je do przepływu pracy serwera proxy interfejsu API.
  • Organizacja projektu serwera proxy interfejsu API w systemie plików zgodnie z opisem w dokumentacji dotyczącej konfiguracji serwera proxy interfejsu API. W tym temacie z książki kucharskiej przedstawiamy programowanie lokalne (w oparciu o system plików), a nie programowanie w chmurze, gdzie do tworzenia serwera proxy interfejsu API można użyć interfejsu zarządzania.
  • Użycie weryfikacji klucza interfejsu API. To najprostsza forma zabezpieczeń aplikacji, którą możesz skonfigurować dla interfejsu API. Więcej informacji znajdziesz w artykule o kluczach interfejsu API. Możesz też przejść samouczek dotyczący zabezpieczania interfejsu API przez wymaganie kluczy interfejsu API.
  • praktycznej znajomości języka XML, W tym przykładzie kompilujemy serwer proxy interfejsu API i jego zasady za pomocą plików XML, które znajdują się w systemie plików.

Jeśli masz pobrany przykładowy kod, wszystkie pliki omówione w tym temacie znajdziesz w folderze mashup-policy-cookbook. W poniższych sekcjach szczegółowo omawiamy przykładowy kod.

Płyń z prądem

Zanim przejdziemy do zasad, przyjrzyjmy się głównemu przebiegowi naszego przykładowego serwera proxy interfejsu API. Widoczny poniżej fragment kodu XML procesu zawiera wiele informacji o tym serwerze proxy, używanych przez niego zasadach i miejscach ich wywoływania.

W przykładowym pliku do pobrania znajdziesz ten kod XML 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 tematu. Te zasady dotyczą tworzenia i wysyłania wiadomości z żądaniem oraz analizowania odpowiedzi. Po zakończeniu tego tematu poznasz rolę każdej z tych zasad.
  • <Response> – element <Response> zawiera też element <Steps>. Te kroki wywołują też zasady, które odpowiadają za przetwarzanie końcowej odpowiedzi z docelowego punktu końcowego (Google Elevation API).
  • <HttpProxyConnection> – ten element określa szczegółowe informacje o tym, jak aplikacje będą łączyć się z danym serwerem proxy interfejsu API, w tym <BasePath>, która określa sposób wywołania tego interfejsu API.
  • <RouteRule> – ten element określa, co dzieje się bezpośrednio po przetworzeniu wiadomości z żądania przychodzącego. W tym przypadku jest wywoływany obiekt TargetEndpoint. Ten ważny etap omówimy bardziej szczegółowo w dalszej części tego tematu.

Tworzenie zasad

W kolejnych sekcjach omówiono poszczególne zasady, które składają się na przykład takiej struktury zasad.

Utwórz pierwszą zasadę AssignMessage

Pierwsza zasada AssignMessage pokazana poniżej tworzy wiadomość żądania, która będzie wysyłana do usługi Google Geocoding.

Zacznijmy od kodu zasad, a potem omówimy bardziej szczegółowo jego elementy. W przykładowym pliku do pobrania znajdziesz ten kod XML 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 Przypisywanie zasad dotyczących wiadomości.

  • <AssignMessage name> – nadaje tej zasadzie nazwę. Nazwa jest używana, gdy w procesie odwołuje się do tej zasady.
  • <AssignTo> – tworzy zmienną nazwaną o nazwie GeocodingRequest. Ta zmienna zawiera obiekt żądania, który będzie wysyłany do backendu przez zasadę ServiceCallout.
  • <QueryParams> – ustawia parametry zapytania wymagane przez wywołanie interfejsu API backendu. W tym przypadku interfejs 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 wyodrębniamy je w tym miejscu. Parametr sensor jest wymagany przez interfejs API i ma wartość prawda lub fałsz. Tutaj ustawiamy go na stałe na wartość false (fałsz).
  • <Verb> – w tym przypadku tworzymy proste żądanie GET do interfejsu API.
  • <AssignVariable> – te zmienne przechowują wartości, które przekazujemy do interfejsu API. W tym przykładzie zmienne zostaną udostępnione później w odpowiedzi zwróconej klientowi.

Wyślij prośbę z wyjaśnieniem usługi

Następnym krokiem w sekwencji tworzenia zasad jest utworzenie zasady ServiceCallout. Wymieniona poniżej zasada ServiceCallout wysyła obiekt żądania utworzony w poprzedniej zasadzie AssignMessage do usługi Google Geocoding i zapisuje wynik w zmiennej o nazwie GeocodingResponse.

Tak jak poprzednio, przyjrzyjmy się kodowi. Poniżej podajemy szczegółowe wyjaśnienie. Więcej informacji o tych zasadach znajdziesz w zasadach dotyczących objaśnień dotyczących usługi. W przykładowym pliku do pobrania znajdziesz ten kod XML 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> – tak jak poprzednia zasada, ta ma nazwę.
  • <Request zmienna> – zmienna utworzona w zasadzie AssignMessage. Obejmuje żądanie trafiające do interfejsu API backendu.
  • <Response> – ten element nadaje nazwę zmiennej, w której jest przechowywana odpowiedź. Jak zobaczysz, dostęp do tej zmiennej uzyska później zasada ExtractVariables.
  • <HTTPTargetConnection> – określa docelowy adres URL interfejsu API backendu. W tym przypadku wskazujemy, że interfejs API zwraca odpowiedź JSON.

Mamy teraz 2 zasady. Jedna określa informacje o żądaniu potrzebne do użycia interfejsu API backendu (Google Geocoding API), a druga rzeczywiście wysyła żądanie do backendu API. Następnie zajmiemy się odpowiedzią.

Przeanalizowanie odpowiedzi za pomocą funkcji ExtractVariables

Zasada ExtractVariables zapewnia prosty mechanizm analizowania treści z wiadomości z odpowiedzią uzyskanej przez zasadę ServiceCallout. Zmiennej można używać do analizowania danych JSON lub XML oraz do wyodrębniania treści ze ścieżek URI, nagłówków HTTP, parametrów zapytań i parametrów formularza.

Oto lista zasad ExtractVariables. Więcej informacji o tej zasadzie znajdziesz w artykule o wyodrębnianiu zmiennych. W przykładowym pliku do pobrania znajdziesz ten kod XML 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:

  • <nazwa zasady> – ponownie służy do odwoływania się do zasady, gdy jest używana w procesie.
  • <Source> – określa zmienną odpowiedzi utworzoną w zasadzie ServiceCallout. To jest zmienna, z której ta zasada wyodrębnia dane.
  • <VariablePrefix> – prefiks zmiennej określa przestrzeń nazw innych zmiennych utworzonych w tej zasadzie. Prefiks może być dowolną nazwą z wyjątkiem nazw zarezerwowanych zdefiniowanych przez zdefiniowane przez siebie zmienne Edge.
  • <JSONPayload> – ten element pobiera dane odpowiedzi, które nas interesują, i umieszcza je w nazwanych zmiennych. W rzeczywistości interfejs Geocoding API zwraca znacznie więcej informacji niż szerokość i długość geograficzna. To jednak jedyne wartości, których potrzebujemy w tej próbce. Pełne wyrenderowanie pliku JSON zwróconego przez Geocoding API znajdziesz w dokumentacji interfejsu API. Wartości geometry.location.lat i geometry.location.lng to po prostu 2 z wielu pól w zwróconym obiekcie JSON.

Może to nie być oczywiste, ale trzeba pamiętać, że ExtractVariables tworzy 2 zmienne, których nazwy składają się z prefiksu zmiennej (odpowiedź geokodu) i rzeczywistych nazw zmiennych określonych w zasadach. Te zmienne są przechowywane na serwerze proxy interfejsu API i jak zobaczysz, będą dostępne dla innych zasad w ramach procesu serwera proxy. Zmienne to:

  • geocoderesponse.latitude
  • geocoderesponse.longitude

Większość pracy została wykonana. Utworzyliśmy zbiór 3 zasad, które tworzą żądanie, wywołują interfejs API backendu i analizują zwrócone dane JSON. W ostatnich krokach przekażemy dane z tej części procesu do innej zasady AssignMessage, wywołamy drugi interfejs API backendu (Google Elevation API) i zwrócimy połączone dane deweloperowi aplikacji.

Wygeneruj drugie żądanie za pomocą AssignMessage

Poniższa zasada AssignMessage korzysta ze zmiennych zwróconych z pierwszego zapisanego backendu (Google Geocoding) i umieszcza je w żądaniu przeznaczonym dla drugiego interfejsu API (Google Elevation). Jak już wspomnieliśmy, te zmienne to deeplinkresponse.width i geokodresponse.Length.

W przykładowym pliku do pobrania znajdziesz ten kod XML 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>

Po sprawdzeniu interfejsu Google Elevation API okazuje się, że używa on 2 parametrów zapytania. Pierwsza z nich to locations, a jej wartością jest szerokość i długość geograficzna (wartości rozdzielone przecinkami). Drugi parametr to sensor, który jest wymagany i musi mieć wartość prawda lub fałsz. Przede wszystkim pamiętaj, że tworzona tutaj wiadomość z żądaniem nie wymaga wywołania ServiceCallout. W tej chwili nie trzeba wywoływać drugiego interfejsu API z wywołania ServiceCallout, ponieważ możemy wywoływać interfejs API backendu z punktu końcowego docelowego punktu końcowego serwera proxy. Jeśli się nad tym zastanawiasz, mamy wszystkie dane potrzebne do wywołania Google Elevations API. Wiadomość żądania wygenerowana w tym kroku nie wymaga wywołania usługi, ponieważ żądanie wygenerowane dla głównego potoku żądań jest po prostu przekazywane przez punkt końcowy do punktu docelowego ProxyEndpoint zgodnie z regułą RouteRule skonfigurowaną dla tego serwera proxy interfejsu API. Docelowy punkt końcowy zarządza połączeniem ze zdalnym interfejsem API. Pamiętaj, że adres URL interfejsu API podniesienia jest zdefiniowany w punkcie HTTPConnection dla elementu TargetEndpoint. Dokumentacja interfejsu Elevation API, jeśli chcesz dowiedzieć się więcej. Zapisane wcześniej parametry QueryParams (country i postalcode) nie są już potrzebne, dlatego usuwamy je tutaj.

Krótkie wstrzymanie: powrót do procedury

być może zastanawiasz się, dlaczego nie tworzymy nowych zasad dotyczących objaśnienia usług. W końcu utworzyliśmy kolejną wiadomość. Jak ta wiadomość jest wysyłana do celu, czyli interfejsu Google Elevation API? Odpowiedź znajduje się w elemencie <RouteRule> w przepływie. <RouteRule> określa, co zrobić z wszelkimi pozostałymi komunikatami żądania po wykonaniu części <Request> przepływu. Punkt końcowy docelowego określony przez ten tag <RouteRule> informuje serwer proxy interfejsu API, aby dostarczyć wiadomość do http://maps.googleapis.com/maps/api/elevation/xml.

Jeśli pobrano przykładowy serwer proxy interfejsu API, plik 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 przetworzyć odpowiedź z interfejsu Google Elevation API.

Konwertuj odpowiedź z XML na JSON

W tym przykładzie odpowiedź z interfejsu Google Elevation API jest zwracana jako XML. Aby „dodatkowy udział” dodać, dodajmy jeszcze jedną zasadę do naszego złożonego elementu, aby przekształcić odpowiedź z XML na JSON.

W tym przykładzie do konwersji używana jest zasada JavaScript o nazwie GenerateResponse, w której plik zasobów zawiera kod JavaScript. Poniżej znajduje się definicja zasady GenerateResponse:

<Javascript name="GenerateResponse" timeout="10000">
  <ResourceURL>jsc://GenerateResponse.js</ResourceURL>
</Javascript>

Plik zasobów GenerateResponse.js zawiera kod JavaScript użyty do wykonania konwersji. Znajdziesz go w pliku doc-samples/policy-mashup-cookbook/apiproxy/resources/JSC/GenerateResponse.js.

Apigee udostępnia też gotowe zasady XMLToJSON, które pozwalają przekonwertować kod XML na format JSON. Możesz edytować punkt ProxyEndpoint, aby zamiast niego używać zasady xmltojson pokazanej poniżej.

<XMLToJSON name="xmltojson">
  <Options>
  </Options>
  <OutputVariable>response</OutputVariable>
  <Source>response</Source>
</XMLToJSON>

Testowanie przykładu

Jeśli nie masz jeszcze pliku, pobierz, wdróż i uruchom przykładowy dokument policy-mashup-cookbook. Znajdziesz go w folderze przykładów dokumentów w repozytorium przykładów Apigee Edge na GitHubie. Wystarczy, że będziesz postępować zgodnie z instrukcjami w pliku README w folderze policy-mashup-cookbook. Możesz też wykonać krótkie instrukcje opisane tutaj: Korzystanie z przykładowych serwerów proxy interfejsu API.

Podsumowując, możesz wywołać złożony interfejs API w ten sposób. Zastąp ciąg {myorg} nazwą swojej organizacji:

$ curl "http://{myorg}-test.apigee.net/policy-mashup-cookbook?country=us&postalcode=08008"

Odpowiedź zawiera wskazaną geograficznie lokalizację pośrodku kodu pocztowego podaną przez użytkownika aplikacji oraz wysokość nad poziomem morza w tej lokalizacji geograficznej. Dane zostały pobrane z 2 interfejsów API backendu, połączone z zasadami przyłączonymi do serwera proxy interfejsu API i zwrócone klientowi w jednej odpowiedzi.

{  
   "country":"us",
   "postalcode":"08008",
   "elevation":{  
      "meters":0.5045232,
      "feet":1.6552599030345978
   },
   "location":{  
      "latitude":39.75007129999999,
      "longitude":-74.1357407
   }
}

Podsumowanie

W tym temacie książki kucharskiej wyjaśniono, jak korzystać ze wzorca struktury zasad do tworzenia mashupów danych z różnych źródeł backendu. Kompozycja zasad to typowy wzorzec używany przy tworzeniu serwera proxy interfejsu API do dodawania funkcji kreacji do interfejsu API.