Richtlinienzusammensetzung verwenden

Sie sehen die Dokumentation zu Apigee Edge.
Zur Apigee X-Dokumentation
weitere Informationen

In diesem Artikel erfahren Sie, wie Sie mithilfe der Richtlinienzusammensetzung ein Mashup erstellen. Die Richtlinienzusammensetzung ist ein Apigee-Proxy-Muster, mit dem Sie Ergebnisse aus mehreren Back-End-Zielen mithilfe von Richtlinien zu einer einzigen Antwort kombinieren können.

Einen allgemeinen Überblick über die Richtlinienzusammensetzung finden Sie unter "Richtlinienzusammensetzungsmuster" in API-Proxy-Cookbook-Muster.

Beispielcode herunterladen und ausprobieren

Über dieses Kochbuchbeispiel

Dieses Beispiel für eine Rezeptesammlung veranschaulicht ein API-Proxy-Muster namens Richtlinienzusammensetzung. Dieses Muster bietet eine Möglichkeit (es gibt andere), Daten aus mehreren Back-End-Quellen zusammenzuführen. Im Allgemeinen zeigt dieses Thema, wie Richtlinien kombiniert und verkettet werden können, um das gewünschte Ergebnis zu erzielen. Einen allgemeinen Überblick über dieses und ähnliche Muster finden Sie unter API-Proxy-Cookbook-Muster.

Im hier beschriebenen Beispiel wird die Richtlinienzusammensetzung verwendet, um Daten aus diesen beiden separaten öffentlichen APIs zusammenzuführen:

  • Die Google Geocoding API: Diese API wandelt Adressen wie „1600 Amphitheatre Parkway, Mountain View, CA“ in geografische Koordinaten um, z. B. den Breitengrad 37.423021 und den Längengrad -122.083739.
  • Google Elevation API Diese API bietet eine einfache Schnittstelle, mit der Höhendaten für Standorte auf der Erde abgefragt werden können. In diesem Beispiel werden die von der Geocoding API zurückgegebenen Koordinaten als Eingabe in die API verwendet.

App-Entwickler rufen diesen API-Proxy mit zwei Abfrageparametern, einer Postleitzahl und einer Länder-ID auf:

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

Die Antwort ist ein JSON-Objekt, das den geocodierten Standort (Breiten- und Längengrad) für die Mitte des angegebenen Postleitzahlenbereichs und die Höhe an diesem geocodierten Standort enthält.

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

Hinweis

Eine kurze Übersicht über das Muster der Richtlinienzusammensetzung finden Sie unter „Richtlinienzusammensetzungsmuster“ unter API-Proxy-Cookbook-Muster.

Bevor Sie sich dieses Kochbuchbeispiel ansehen, sollten Sie auch mit den folgenden grundlegenden Konzepten vertraut sein:

  • Was sind Richtlinien und wie werden sie an Proxys angehängt? Eine gute Einführung in Richtlinien finden Sie unter Was ist eine Richtlinie?.
  • Die Struktur eines API-Proxy-Ablaufs, wie unter Abläufe konfigurieren erläutert. Mit Abläufen können Sie die Reihenfolge angeben, in der Richtlinien von einem API-Proxy ausgeführt werden. In diesem Beispiel werden mehrere Richtlinien erstellt und dem Ablauf des API-Proxys hinzugefügt.
  • Wie ein API-Proxy-Projekt in Ihrem Dateisystem strukturiert ist, wie in der Referenz zur API-Proxy-Konfiguration erläutert In diesem Cookbook-Thema wird die lokale Entwicklung (dateisystembasiert) im Gegensatz zur cloudbasierten Entwicklung beschrieben, bei der Sie die Verwaltungs-UI zur Entwicklung des API-Proxys verwenden können.
  • Verwendung der API-Schlüsselvalidierung. Dies ist die einfachste Form der anwendungsbasierten Sicherheit, die Sie für eine API konfigurieren können. Weitere Informationen finden Sie unter API-Schlüssel. Sie können auch die Anleitung API mit Anforderung von API-Schlüsseln sichern durchgehen.
  • Sie haben Grundkenntnisse im Umgang mit XML. In diesem Beispiel erstellen wir den API-Proxy und seine Richtlinien mit XML-Dateien, die sich im Dateisystem befinden.

Wenn Sie den Beispielcode heruntergeladen haben, finden Sie alle in diesem Thema beschriebenen Dateien im Beispielordner mashup-policy-cookbook. In den folgenden Abschnitten wird der Beispielcode ausführlich behandelt.

Der Fluss

Werfen wir einen Blick auf den Hauptablauf unseres Beispiel-API-Proxys, bevor wir zu den Richtlinien übergehen. Die unten gezeigte Fluss-XML enthält viel über diesen Proxy, die von ihm verwendeten Richtlinien und den Aufruf dieser Richtlinien.

Im Beispieldownload finden Sie diesen XML-Code in der Datei 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>

Hier ist eine Zusammenfassung der Ablaufelemente.

  • <Request>: Das <Request>-Element besteht aus mehreren <Step>-Elementen. Mit jedem Schritt wird eine der Richtlinien aufgerufen, die wir im weiteren Verlauf dieses Themas erstellen. Diese Richtlinien betreffen das Erstellen und Senden einer Anfragenachricht und das Parsen der Antwort. Am Ende dieses Themas verstehen Sie die Rolle jeder dieser Richtlinien.
  • <Response>: Das <Response>-Element enthält auch <Steps>. Durch diese Schritte werden auch Richtlinien aufgerufen, die für die Verarbeitung der endgültigen Antwort vom Zielendpunkt (Google Elevation API) verantwortlich sind.
  • <HttpProxyConnection> – Dieses Element gibt Details dazu an, wie Apps eine Verbindung zu diesem API-Proxy herstellen, einschließlich <BasePath>, der angibt, wie diese API aufgerufen wird.
  • <RouteRule>: Dieses Element gibt an, was sofort nach der Verarbeitung der eingehenden Anfragenachrichten geschieht. In diesem Fall wird der TargetEndpoint aufgerufen. Wir werden später in diesem Kapitel ausführlicher auf diesen wichtigen Schritt eingehen.

Richtlinien erstellen

In den folgenden Abschnitten werden die einzelnen Richtlinien erläutert, aus denen sich dieses Beispiel für die Richtlinienzusammensetzung zusammensetzt.

Erste AttributionMessage-Richtlinie erstellen

Mit der ersten unten aufgeführten AssignMessage-Richtlinie wird eine Anfragenachricht erstellt, die an den Google Geocoding-Dienst gesendet wird.

Beginnen wir mit dem Richtliniencode und gehen dann genauer auf seine Elemente ein. Im Beispieldownload finden Sie diesen XML-Code in der Datei 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>

Im Folgenden werden die Bestandteile dieser Richtlinie kurz beschrieben. Weitere Informationen zu dieser Richtlinie finden Sie unter Nachrichtenrichtlinie zuweisen.

  • <AssignMessage name>: Gibt dieser Richtlinie einen Namen. Der Name wird verwendet, wenn in einem Ablauf auf die Richtlinie verwiesen wird.
  • <AssignTo>: Erstellt eine benannte Variable namens GeocodingRequest. Diese Variable kapselt das Anfrageobjekt, das von der ServiceCallout-Richtlinie an das Back-End gesendet wird.
  • <QueryParams>: Legt die Abfrageparameter fest, die vom Back-End-API-Aufruf benötigt werden. In diesem Fall muss die Geocoding API den Standort kennen, der mit einer Postleitzahl und einer Länder-ID ausgedrückt wird. Der App-Nutzer stellt diese Informationen bereit und wir extrahieren sie einfach hier. Der Parameter sensor wird von der API benötigt und ist entweder „true“ oder „false“. Wir hartcodieren ihn hier einfach mit „false“.
  • <Verb>: In diesem Fall stellen wir eine einfache GET-Anfrage an die API.
  • <AssignVariable>: In diesen Variablen werden die Werte gespeichert, die an die API übergeben werden. In diesem Beispiel wird später in der an den Client zurückgegebenen Antwort auf die Variablen zugegriffen.

Anfrage mit ServiceCallout senden

Der nächste Schritt in der Sequenz zur Richtlinienzusammensetzung besteht darin, eine ServiceCallout-Richtlinie zu erstellen. Die unten aufgeführte ServiceCallout-Richtlinie sendet das Anfrageobjekt, das in der vorherigen AttributionMessage-Richtlinie erstellt wurde, an den Google Geocoding-Dienst und speichert das Ergebnis in einer Variablen namens „GeocodingResponse“.

Wie zuvor sehen wir uns zuerst den Code an. Im Folgenden finden Sie eine detaillierte Erläuterung. Weitere Informationen zu dieser Richtlinie finden Sie unter Service-Callout-Richtlinie. Im Beispieldownload finden Sie diesen XML-Code in der Datei 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>

Im Folgenden finden Sie eine kurze Beschreibung der Bestandteile dieser Richtlinie.

  • <ServiceCallout>: Wie die vorherige Richtlinie hat auch diese einen Namen.
  • <Request variable> – Dies ist die Variable, die in derAssignMessage-Richtlinie erstellt wurde. Sie kapselt die Anfrage an die Back-End-API.
  • <Response>: Dieses Element benennt eine Variable, in der die Antwort gespeichert wird. Wie Sie sehen, wird später von der Richtlinie „ExtractVariables“ auf diese Variable zugegriffen.
  • <HTTPTargetConnection> – Gibt die Ziel-URL der Back-End-API an. In diesem Fall geben wir an, dass die API eine JSON-Antwort zurückgibt.

Jetzt haben wir zwei Richtlinien: die eine gibt die Anfrageinformationen an, die für die Verwendung der Back-End API (Geocoding API von Google) erforderlich sind, und die zweite, die die Anfrage an die Back-End API sendet. Als Nächstes bearbeiten wir die Antwort.

Antwort mit ExtractVariables parsen

Die Richtlinie "ExtractVariables" bietet einen einfachen Mechanismus zum Parsen von Inhalt aus der Antwortnachricht, die von einer ServiceCallout-Richtlinie abgerufen wird. ExtractVariables kann zum Parsen von JSON oder XML verwendet werden oder zum Extrahieren von Inhalten aus URI-Pfaden, HTTP-Headern, Abfrageparametern und Formularparametern.

Hier ist eine Liste der ExtractVariables-Richtlinie. Weitere Informationen zu dieser Richtlinie finden Sie unter Richtlinie für Variablen extrahieren. Im Beispieldownload finden Sie diesen XML-Code in der Datei 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>

Die wichtigsten Elemente der ExtractVariable-Richtlinie sind:

  • <ExtractVariables name>: Auch hier wird der Richtlinienname verwendet, um auf die Richtlinie zu verweisen, wenn sie in einem Ablauf verwendet wird.
  • <Source>: Gibt die Antwortvariable an, die in der ServiceCallout-Richtlinie erstellt wurde. Das ist die Variable, aus der diese Richtlinie Daten extrahiert.
  • <VariablePrefix>: Das Variablenpräfix gibt einen Namespace für andere in dieser Richtlinie erstellte Variablen an. Das Präfix kann ein beliebiger Name sein, mit Ausnahme der reservierten Namen, die durch die vordefinierten Variablen von Edge definiert sind.
  • <JSONPayload>: Dieses Element ruft die für uns interessanten Antwortdaten ab und fügt sie in benannte Variablen ein. Die Geocoding API gibt viel mehr Informationen zurück als Breiten- und Längengrade. Dies sind jedoch die einzigen Werte, die wir für dieses Beispiel benötigen. Eine vollständige Darstellung der von der Geocoding API zurückgegebenen JSON-Daten finden Sie in der API-Dokumentation. Die Werte von geometry.location.lat und geomet.location.lng sind einfach zwei von vielen Feldern im zurückgegebenen JSON-Objekt.

Es mag nicht offensichtlich sein, aber es ist wichtig zu erkennen, dass ExtractVariables zwei Variablen erzeugt, deren Namen aus dem Variablenpräfix (georesponse) und den tatsächlichen Variablennamen bestehen, die in der Richtlinie festgelegt sind. Diese Variablen werden im API-Proxy gespeichert und stehen anderen Richtlinien innerhalb des Proxy-Ablaufs zur Verfügung, wie Sie sehen werden. Die Variablen sind:

  • geocoderesponse.latitude
  • geocoderesponse.longitude

Der Großteil der Arbeit ist jetzt erledigt. Wir haben eine Kombination aus drei Richtlinien erstellt, die eine Anfrage bilden, eine Back-End-API aufrufen und die zurückgegebenen JSON-Daten parsen. In den letzten Schritten speisen wir Daten aus diesem Teil des Ablaufs in eine andereAssignMessage-Richtlinie ein, rufen die zweite Back-End-API (Google Elevation API) auf und geben die aggregierten Daten an den App-Entwickler zurück.

Zweite Anfrage mitAssignMessage generieren

Die folgende AttributionMessage-Richtlinie verwendet Variablen, die vom ersten gespeicherten Back-End (Google Geocoding) zurückgegeben wurden, und fügt sie in eine Anfrage ein, die für die zweite API (Google Elevation) bestimmt ist. Wie bereits erwähnt, lauten diese Variablen Geocodingresponse.latitude und georesponse.longitude.

Im Beispieldownload finden Sie diesen XML-Code in der Datei 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>

Wenn Sie das Google Elevation API untersuchen, werden Sie feststellen, dass es zwei Abfrageparameter benötigt. Die erste heißt locations und hat den Breiten- und Längengrad (durch Kommas getrennte Werte). Der andere Parameter ist sensor. Dieser ist erforderlich und muss entweder wahr oder falsch sein. Das Wichtigste an dieser Stelle ist, dass für die hier erstellte Anfragenachricht kein ServiceCallout erforderlich ist. Die zweite API muss nicht mehr über ein ServiceCallout aufgerufen werden, da wir die Back-End-API über den TargetEndpoint des Proxys aufrufen können. Wenn Sie darüber nachdenken, haben wir alle Daten, die wir zum Aufrufen der Google Elevations API benötigen. Die in diesem Schritt generierte Anfragenachricht erfordert kein ServiceCallout, da die für die Hauptanfragepipeline generierte Anfrage einfach vom ProxyEndpoint an den TargetEndpoint weitergeleitet wird. Dies geschieht gemäß der für diesen API-Proxy konfigurierten RouteRule. Der TargetEndpoint verwaltet die Verbindung mit der Remote-API. (Denken Sie daran, dass die URL für die Elevation API in der HTTPConnection für den TargetEndpoint definiert ist. Elevation API-Dokumentation. Die zuvor gespeicherten Abfrageparameter country und postalcode werden nicht mehr benötigt. Deshalb entfernen wir sie hier.

Kurze Pause: Zurück zum Flow

An dieser Stelle fragen Sie sich vielleicht, warum wir keine weitere ServiceCallout-Richtlinie erstellen. Schließlich haben wir eine weitere Nachricht erstellt. Wie wird diese Nachricht an das Ziel gesendet, die Google Elevation API? Die Antwort befindet sich im <RouteRule>-Element des Ablaufs. <RouteRule> gibt an, was mit den verbleibenden Anfragenachrichten geschehen soll, nachdem der <Request>-Teil des Ablaufs ausgeführt wurde. Der in dieser <RouteRule> angegebene TargetEndpoint weist den API-Proxy an, die Nachricht an http://maps.googleapis.com/maps/api/elevation/xml zuzustellen.

Wenn Sie den API-Beispiel-Proxy heruntergeladen haben, finden Sie die TargetProxy-XML in der Datei 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>

Jetzt müssen wir nur noch die Antwort der Google Elevation API verarbeiten. Das ist alles.

Antwort von XML in JSON konvertieren

In diesem Beispiel wird die Antwort des Google Elevation APIs im XML-Format zurückgegeben. Fügen wir dem zusammengesetzten Objekt eine weitere Richtlinie hinzu, um die Antwort von XML in JSON zu transformieren.

In diesem Beispiel wird die JavaScript-Richtlinie „GenerateResponse“ mit einer Ressourcendatei mit dem JavaScript-Code verwendet, um die Konvertierung durchzuführen. Unten sehen Sie die Richtliniendefinition GenerateResponse:

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

Die Ressourcendatei GenerateResponse.js enthält den JavaScript-Code, der für die Konvertierung verwendet wurde. Sie finden diesen Code in der Datei doc-samples/policy-mashup-cookbook/apiproxy/resources/JSC/GenerateResponse.js.

Apigee bietet außerdem die vorkonfigurierte Richtlinie XMLToJSON zum Konvertieren von XML in JSON. Sie können den ProxyEndpoint so bearbeiten, dass stattdessen die unten aufgeführte Richtlinie xmltojson verwendet wird.

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

Beispiel testen

Falls noch nicht geschehen, laden Sie das Beispiel policy-mashup-cookbook herunter, stellen Sie es bereit und führen Sie es aus. Sie finden es im Ordner „doc-Beispiele“ im GitHub-Repository für Apigee Edge-Beispiele. Folgen Sie einfach der Anleitung in der INFO-Datei im Ordner policy-mashup-cookbook. Alternativ können Sie dieser kurzen Anleitung folgen: Beispiel-API-Proxys verwenden.

Zusammenfassend lässt sich sagen, dass Sie die zusammengesetzte API wie folgt aufrufen können. Ersetzen Sie {myorg} durch den Namen Ihrer Organisation:

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

Die Antwort enthält den vom App-Endnutzer angegebenen Ort für die Mitte der Postleitzahl, kombiniert mit der Höhe an diesem geocodierten Standort. Die Daten wurden von zwei Back-End-APIs abgerufen, mit Richtlinien verknüpft, die an den API-Proxy angehängt waren, und in einer einzigen Antwort an den Client zurückgegeben.

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

Zusammenfassung

In diesem Cookbook-Thema wurde erläutert, wie mithilfe des Richtlinienzusammensetzungsmusters ein Mashup von Daten aus mehreren Back-End-Quellen erstellt wird. Die Richtlinienzusammensetzung ist ein gängiges Muster, das bei der API-Proxy-Entwicklung zum Hinzufügen von Creative-Funktionen zu Ihrer API verwendet wird.