Utiliser la composition de règles

<ph type="x-smartling-placeholder"></ph> Vous consultez la documentation Apigee Edge.
Accédez à la page Documentation sur Apigee X.
En savoir plus

Dans cette rubrique, vous allez apprendre à créer une application composite à l'aide de la composition des règles. La composition des règles est un modèle de proxy Apigee qui vous permet de combiner les résultats de plusieurs backends cibles dans une seule réponse à l'aide de stratégies.

Pour obtenir une présentation générale de la composition des règles, consultez la section "Modèle de composition de règles" dans le Livre de recettes des proxys d'API des modèles.

Télécharger et tester l'exemple de code

<ph type="x-smartling-placeholder">

À propos de cet exemple de livre de recettes

Cet exemple de livre de recettes illustre un modèle de proxy d'API appelé policy composition (composition de la règle). Ce modèle fournit un moyen (il en existe d'autres) de mettre en corrélation des données provenant de plusieurs sources backend. Plus généralement, cette rubrique montre comment les stratégies peuvent être combinées et liées pour produit le résultat souhaité. Pour obtenir une présentation générale de ce modèle et d'autres modèles connexes, consultez Livre de recettes des proxys d'API des modèles.

L'exemple présenté ici utilise la composition de règles pour mettre en corrélation les données de ces deux API publiques:

  • Google Geocoding API: cette API convertit des adresses (par exemple, "8 rue de Londres, Paris"). en coordonnées géographiques (comme latitude 37.423021 et longitude -122.083739).
  • Google Elevation API Cette API fournit une interface simple pour demander l'altitude de points géographiques sur Terre. données. Dans cet exemple, les coordonnées renvoyées par l'API Geocoding seront utilisées comme entrées dans cette API.

Les développeurs d'applications appelleront ce proxy d'API avec deux paramètres de requête, un code postal et un pays ID:

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

La réponse est un objet JSON qui inclut le lieu géocodé (latitude/longitude) pour le centre de la zone du code postal fourni, combiné à l'altitude dans ce géocode l'emplacement.

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

Avant de commencer

Si vous souhaitez obtenir un bref aperçu du modèle de composition des règles, consultez la section motif de composition" dans le Livre de recettes des proxys d'API des modèles.

Avant d'explorer cet exemple de livre de recettes, vous devez également connaître ces concepts fondamentaux concepts:

  • En quoi consistent les stratégies et comment les associer à des proxys ? Pour bien présenter les règles, consultez la section Qu'est-ce qu'un de sécurité ?
  • La structure d'un flux de proxy d'API, comme expliqué dans la section Configurer des flux Les flux vous permettent spécifier la séquence dans laquelle les stratégies sont exécutées par un proxy d'API. Dans cet exemple, plusieurs des stratégies sont créées et ajoutées au flux du proxy d'API.
  • Comment un projet de proxy d'API est organisé sur votre système de fichiers, comme expliqué dans Documentation de référence sur la configuration du proxy d'API Cette rubrique du livre de recettes illustre le développement local (fichier basé sur le système), contrairement au développement dans le cloud, où l'on peut utiliser l'UI de gestion pour développer le proxy d'API.
  • Utilisation de la validation des clés API Il s'agit de la forme la plus simple de sécurité basée sur les applications pour une API. Pour en savoir plus, consultez la section API clés. Vous pouvez également consulter la page Sécuriser une API en exigeant des clés API.
  • Connaissance pratique du langage XML Dans cet exemple, nous créons le proxy d'API et ses avec des fichiers XML qui résident sur le système de fichiers.

Si vous avez téléchargé l'exemple de code, vous pouvez localiser tous les fichiers abordés dans ce dans le dossier d'exemple mashup-policy-cookbook. Les sections suivantes l'exemple de code en détail.

Suivre le rythme

Avant de passer aux règles, examinons le flux principal de notre exemple. proxy d'API. Le flux XML, illustré ci-dessous, nous en dit beaucoup sur ce proxy, les stratégies qu'il et où ces stratégies sont appelées.

Dans l'exemple de téléchargement, ce code XML se trouve dans le fichier 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>

Voici un résumé des éléments du flux.

  • &lt;Request&gt; – La <Request> se compose de plusieurs éléments &lt;Step&gt; éléments. Chaque étape appelle l'une des stratégies que nous créerons dans les autres de ce sujet. Ces stratégies concernent la création d'un message de requête, son envoi et analyser la réponse. À la fin de ce sujet, vous comprendrez le rôle de chacun de ces règles.
  • &lt;Response&gt; – La <Response> inclut également <Steps>. Ces étapes appellent également des stratégies qui sont chargées de traiter le code final du point de terminaison cible (API Google Elevation).
  • &lt;HttpProxyConnection&gt; : Cet élément spécifie les détails sur la manière dont les applications se connecteront à ce proxy d'API, y compris <BasePath>, qui spécifie comment cette API est appelée.
  • &lt;RouteRule&gt; : cet élément spécifie ce qui se passe immédiatement. après le traitement des messages de requête entrants. Dans ce cas, le point de terminaison cible est appelé. Nous aborderons cette étape importante plus en détail dans la suite de cet article.

Créer les règles

Les sections suivantes décrivent chacune des règles qui composent cette composition de stratégie à titre d'exemple.

Créer le premier AffectMessage règlement

La première règle AssignMessage, ci-dessous, crée un message de requête qui sera envoyé au service Google Cloud.

Commençons par le code de stratégie, puis nous expliquerons plus en détail ses éléments. Dans exemple de téléchargement. Vous trouverez ce code XML dans le fichier 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>

Voici une brève description des éléments de ces règles. Vous pouvez en savoir plus à ce sujet dans la section Attribuer des rôles Règle relative aux messages

  • <AssignMessage name> : donne un nom à cette règle. Son nom est utilisée lorsque la stratégie est référencée dans un flux.
  • &lt;AssignTo&gt; : crée une variable nommée appelée GeocodingRequest. Cette variable encapsule l'objet de la requête qui sera envoyé au backend par ServiceAccroches.
  • &lt;QueryParams&gt; : définit les paramètres de requête requis par la d'un appel d'API backend. Dans ce cas, l'API Geocoding a besoin de connaître le lieu, c'est-à-dire exprimé à l'aide d'un code postal et d'un identifiant de pays. L'utilisateur de l'application fournit ces informations. il suffit de l'extraire ici. Le paramètre sensor est requis par l'API. Il est "true" ou "false", et nous l'avons codée en dur en "false" ici.
  • &lt;Verb&gt; : dans ce cas, nous envoyons une simple demande GET au API.
  • &lt;AssignVariable&gt; : ces variables stockent les valeurs que nous que vous transmettez à l'API. Dans cet exemple, les variables seront consultées plus tard dans la réponse sont renvoyées au client.

Envoyer la requête avec ServiceCall

L'étape suivante de la séquence de composition de la règle consiste à créer une règle ServiceCallout. La La stratégie ServiceAccroche, répertoriée ci-dessous, envoie l'objet de requête que nous avons créé dans la l'ancienne règle TransferMessage au service Google Geocoding, puis enregistre le résultat dans une appelée GeocodingResponse.

Comme précédemment, examinons d'abord le code. Vous trouverez une explication détaillée ci-après. Vous pouvez lire Pour en savoir plus sur cette règle, consultez la section Appel de service Règles. Dans l'exemple de téléchargement, ce code XML se trouve dans le fichier 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>

Voici une brève description des différents éléments de ces règles.

  • &lt;ServiceCallout&gt; : comme pour la règle précédente, celle-ci comporte un son nom.
  • <Variable de requête> : il s'agit de la variable qui a été créée dans la règle AssignMessage. Il encapsule la requête envoyée à l'API backend.
  • &lt;Response&gt; : cet élément nomme une variable dans laquelle la réponse sont stockées. Comme vous le verrez, cette variable sera consultée ultérieurement par la fonction ExtractVariables .
  • &lt;HTTPTargetConnection&gt; : spécifie l'URL cible du backend. API. Dans ce cas, nous indiquons que l'API doit renvoyer une réponse JSON.

Nous avons maintenant deux stratégies, l'une spécifiant les informations de requête nécessaires pour utiliser (l'API Geocoding de Google) et la seconde qui envoie réellement la requête à l'API backend. Ensuite, nous allons gérer la réponse.

Analyser la réponse avec ExtractVariables

La règle ExtractVariables fournit un mécanisme simple pour analyser le contenu de la message de réponse obtenu par une stratégie ServiceCall. ExtractVariables peut être utilisé pour analyser JSON ou XML, ou elles peuvent servir à extraire du contenu à partir de chemins d'URI, d'en-têtes HTTP, de requêtes des paramètres et des paramètres de formulaire.

Voici une liste des règles ExtractVariables. Pour en savoir plus sur cette règle, consultez l'article Extraire des variables Règles. Dans l'exemple de téléchargement, ce code XML se trouve dans le fichier 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>

Les principaux éléments de la règle ExtractVariable sont les suivants:

  • <ExtractVariables name> : à nouveau, le nom de la règle est utilisé pour se référer à la règle lorsqu'elle est utilisée dans un flux.
  • &lt;Source&gt; : spécifie la variable de réponse que nous avons créée dans la règle ServiceAccroche. Il s'agit de la variable à partir de laquelle la stratégie extrait les données.
  • &lt;VariablePrefix&gt; : spécifie un espace de noms pour d'autres variables créées dans cette règle. Le préfixe peut être n'importe quel nom, à l'exception du préfixe réservé définis par le rôle Edge variables prédéfinies.
  • &lt;JSONPayload&gt; : cet élément récupère les données de réponse qui sont qui nous intéressent et les place dans des variables nommées. En réalité, l'API Geocoding renvoie plus d'informations que la latitude et la longitude. Cependant, ce sont les seules valeurs dont nous avons besoin pour cet exemple. Vous pouvez voir le rendu complet du fichier JSON renvoyé par l'API Geocoding. dans les API documentation. Les valeurs de geometry.location.lat et geometry.location.lng sont simplement deux des nombreux champs de l'objet JSON renvoyé.

Ce n'est peut-être pas évident, mais il est important de voir que ExtractVariables produit deux variables dont les noms sont composés du préfixe de variable (geocoderesponse) et des valeurs réelles de variables qui sont spécifiés dans la stratégie. Ces variables sont stockées proxy d'API et sera disponible pour d'autres règles dans le flux de proxy, car vous voir. Les variables sont les suivantes:

  • geocoderesponse.latitude
  • geocoderesponse.longitude

La majeure partie du travail est maintenant terminée. Nous avons créé un ensemble de trois stratégies requête, appeler une API backend et analyser les données JSON renvoyées. Dans les dernières étapes, nous transmettrons les données de cette partie du flux vers une autre règle AffectMessage, appelez le deuxième backend (API Google Elevation), puis renvoyez nos données combinées au développeur de l'application.

Générer la seconde requête avec AffectMessage

La stratégie AffectMessage suivante utilise des variables renvoyées par le premier backend (Google Geocoding) que nous avons stocké et les intègre à une requête destinée à la deuxième API (Google Élévation). Comme indiqué précédemment, ces variables sont geocoderesponse.latitude et geocoderesponse.longitude.

Dans l'exemple de téléchargement, ce code XML se trouve dans le fichier 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>

Si vous examinez l'API Google Elevation, vous constaterez qu'elle nécessite deux paramètres de requête. La première s'appelle locations, et sa valeur est la latitude et la longitude (valeurs séparées par une virgule). L'autre paramètre est sensor, qui est obligatoire et doit "true" ou "false". La chose la plus importante à noter à ce stade est que la requête que nous créons ici ne nécessite pas d'objet ServiceAccroche. Nous n'avons pas besoin d'appeler la seconde l'API à partir d'un objet ServiceCallout, car nous pouvons appeler l'API backend à partir de l'objet Point de terminaison cible. Si vous y réfléchissez, nous disposons de toutes les données dont nous avons besoin pour appeler le service Google Elevation API Le message de requête généré à cette étape ne nécessite pas d'appel de service, car la méthode générée pour le pipeline de requête principal, et sera donc simplement transférée par ProxyEndpoint vers TargetEndpoint, en suivant la règle de routage configurée pour ce proxy d'API TargetEndpoint gère la connexion avec l'API distante. Notez que l'URL de la page L'API d'élévation est définie dans le protocole HTTPConnection pour le point de terminaison TargetEndpoint. API Elevation documentation si vous souhaitez en savoir plus. Les paramètres de requête que nous avons stockés précédemment, country et postalcode ne sont plus nécessaires, nous les supprimons donc ici.

Brève pause: retour au flux

À ce stade, vous vous demandez peut-être pourquoi nous ne créons pas d'autre règle ServiceAccroche. Après nous avons créé un autre message. Comment ce message est-il envoyé à la cible, API Elevation ? La réponse se trouve dans la règle <RouteRule> du flux. &lt;RouteRule&gt; spécifie ce qu'il faut faire des messages de demande restants après la balise <Request> de le flux a été exécuté. TargetEndpoint spécifié par cette règle <RouteRule> indique au Proxy d'API pour distribuer le message à http://maps.googleapis.com/maps/api/elevation/xml.

Si vous avez téléchargé l'exemple de proxy d'API, vous trouverez le XML TargetProxy dans le fichier 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>

Il ne nous reste plus qu'à traiter la réponse de l'API Google Elevation, terminé.

Convertissez la réponse XML en JSON

Dans cet exemple, la réponse de l'API Google Elevation est renvoyée au format XML. Pour crédit", ajoutons une autre stratégie à notre composite pour transformer la réponse XML en JSON.

Cet exemple utilise la règle JavaScript nommée GenerateResponse, avec un fichier de ressources contenant le code JavaScript pour effectuer la conversion. Ci-dessous, la définition de la stratégie GenerateResponse:

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

Le fichier de ressources GenerateResponse.js inclut le code JavaScript utilisé pour effectuer la la conversion. Vous pouvez voir ce code fichier doc-samples/policy-mashup-cookbook/apiproxy/resources/JSC/GenerateResponse.js.

Apigee fournit également une stratégie prête à l'emploi, XMLToJSON, pour convertir du contenu XML en JSON. Vous pouvez modifiez le point de terminaison ProxyEndpoint pour qu'il utilise la règle xmltojson ci-dessous à la place.

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

Tester l'exemple

Si vous ne l'avez pas déjà fait, essayez de télécharger, de déployer et d'exécuter la policy-mashup-cookbook, que vous pouvez trouver dans le dossier doc-samples du dépôt GitHub d'exemples Apigee Edge. Juste suivez les instructions du fichier README du dossier policy-mashup-cookbook. Ou suivez les instructions succinctes de la page Utilisation les exemples de proxys d'API.

En résumé, vous pouvez appeler l'API composite comme suit. Remplacez {myorg} par votre nom de l'organisation:

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

La réponse inclut l'emplacement géocodé du centre du code postal fourni par l'utilisateur final de l'application, combinées à l'altitude à cet emplacement géocodé. Les données ont été récupérées à partir de deux API backend, combinées aux stratégies associées au proxy d'API, et renvoyés au client dans une seule réponse.

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

Résumé

Cette rubrique du livre de recettes vous a expliqué comment utiliser le modèle de composition de règles pour créer un application composite. de données provenant de plusieurs sources backend. La composition des règles est un modèle couramment utilisé dans les API le développement de proxy pour ajouter des fonctionnalités de création à votre API.