Vous consultez la documentation Apigee Edge.
Accédez à la
documentation**Apigee X**. info
Dans cette rubrique, vous allez apprendre à créer un mashup à l'aide de la composition de règles. La composition de règles est un modèle de proxy Apigee qui vous permet de combiner les résultats de plusieurs cibles de backend dans une seule réponse à l'aide de règles.
Pour obtenir une présentation générale de la composition de règles, consultez la section "Modèle de composition de règles" dans Modèles de livre de recettes du proxy d'API modèles.
Télécharger et essayer l'exemple de code
À propos de cet exemple de livre de recettes
Cet exemple de livre de recettes illustre un modèle de proxy d'API appelé composition de règles. Ce modèle fournit un moyen (parmi d'autres) de combiner des données provenant de plusieurs sources de backend. Plus généralement, cette rubrique explique comment combiner et enchaîner des règles pour obtenir le résultat souhaité. Pour obtenir une présentation générale de ce modèle et d'autres modèles associés, consultez la page Modèles de livre de recettes du proxy d'API patterns.
L'exemple présenté ici utilise la composition de règles pour combiner des données provenant de ces deux API publiques distinctes :
- L'API Google Geocoding : cette API convertit des adresses (comme "1600 Amphitheatre Parkway, Mountain View, CA") en coordonnées géographiques (comme latitude 37.423021 et longitude -122.083739).
- L'API Google Elevation : cette API fournit une interface simple qui permet d'interroger des emplacements sur Terre pour obtenir des données d'altitude. Dans cet exemple, les coordonnées renvoyées par l'API Geocoding seront utilisées comme entrée 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 ID de pays :
$ curl "http://{myorg}-test.apigee.net/policy-mashup-cookbook?country=us&postalcode=08008"
La réponse est un objet JSON qui inclut l'emplacement géocodé (latitude/longitude) pour le centre de la zone de code postal fournie, combiné à l'altitude de cet emplacement géocodé emplacement.
{
"ElevationResponse":{
"status":"OK",
"result":{
"location":{
"lat":"39.7500713",
"lng":"-74.1357407"
},
"elevation":"0.5045232",
"resolution":"76.3516159"
}
}
}Avant de commencer
Si vous souhaitez lire une brève présentation du modèle de composition de règles, consultez la section "Modèle de composition de règles" dans Modèles de livre de recettes du proxy d'API.
Avant d'explorer cet exemple de livre de recettes, vous devez également connaître les concepts fondamentaux suivants :
- Que sont les règles et comment les associer à des proxys. Pour une bonne introduction aux règles, consultez Qu'est-ce qu'une règle ?.
- La structure d'un flux de proxy d'API, comme expliqué dans Configurer des flux. Les flux vous permettent de spécifier la séquence dans laquelle les règles sont exécutées par un proxy d'API. Dans cet exemple, plusieurs règles sont créées et ajoutées au flux du proxy d'API.
- Comment un projet de proxy d'API est organisé dans votre système de fichiers, comme expliqué dans Documentation de référence sur la configuration du proxy d'API. Cette rubrique de livre de recettes présente le développement local (basé sur le système de fichiers) par opposition au développement basé sur le cloud, où vous pouvez utiliser l'interface utilisateur de gestion pour développer le proxy d'API.
- Utilisation de la validation par clé API. Il s'agit de la forme de sécurité la plus simple que vous pouvez configurer pour une API. Pour en savoir plus, consultez Clés API. Vous pouvez également suivre le tutoriel 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 règles à l'aide de fichiers XML qui résident dans le système de fichiers.
Si vous avez téléchargé l'exemple de code, vous trouverez tous les fichiers abordés dans cette rubrique dans le dossier d'exemple mashup-policy-cookbook. Les sections suivantes décrivent l'exemple de code en détail.
Je suis le mouvement, en toute fluidité
Avant de passer aux règles, examinons le flux principal de notre exemple de proxy d'API. Le code XML du flux, présenté ci-dessous, nous en dit long sur ce proxy, les règles qu'il utilise et l'endroit où ces règles sont appelées.
Dans l'exemple de téléchargement, vous trouverez ce code XML 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.
- <Request> : l'élément <Request> se compose de plusieurs éléments <Step>. Chaque étape appelle l'une des règles que nous allons créer dans le reste de cette rubrique. Ces règles concernent la création d'un message de requête, son envoi et l'analyse de la réponse. À la fin de cette rubrique, vous comprendrez le rôle de chacune de ces règles.
- <Response> : l'élément <Response> inclut également des <Steps>. Ces étapes appellent également des règles chargées de traiter la réponse finale du point de terminaison cible (l'API Google Elevation).
- <HttpProxyConnection> : cet élément spécifie des informations sur la façon dont les applications se connecteront à ce proxy d'API, y compris le <BasePath>, qui spécifie comment cette API sera appelée.
- <RouteRule> : 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 TargetEndpoint est appelé. Nous aborderons plus en détail cette étape importante plus loin dans cette rubrique.
Créer les règles
Les sections suivantes décrivent chacune des règles qui composent cet exemple de composition de règles.
Créer la première règle AssignMessage policy
La première règle AssignMessage, listée ci-dessous, crée un message de requête qui sera envoyé au service Google Geocoding service.

Commençons par le code de la règle, puis nous expliquerons ses éléments plus en détail. Dans l'
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 cette règle. Pour en savoir plus sur cette règle, consultez la page Règle AssignMessage.
- <AssignMessage name> : attribue un nom à cette règle. Le nom est utilisé lorsque la règle est référencée dans un flux.
- <AssignTo> : crée une variable nommée GeocodingRequest. Cette variable encapsule l'objet de requête qui sera envoyé au backend par la règle ServiceCallout.
- <QueryParams> : définit les paramètres de requête nécessaires à l'appel d'API de backend. Dans ce cas, l'API Geocoding doit connaître l'emplacement, qui est
exprimé par un code postal et un ID de pays. L'utilisateur de l'application fournit ces informations, et
nous les extrayons simplement ici. Le paramètre
sensorest requis par l'API. Il est défini sur "true" ou "false". Nous le codons en dur sur "false" ici. - <Verb> : dans ce cas, nous effectuons une simple requête GET auprès de l' API.
- <AssignVariable> : ces variables stockent les valeurs que nous transmettons à l'API. Dans cet exemple, les variables seront accessibles ultérieurement dans la réponse renvoyée au client.
Envoyer la requête avec ServiceCallout
L'étape suivante de la séquence de composition de règles consiste à créer une règle ServiceCallout. La règle ServiceCallout, listée ci-dessous, envoie l'objet de requête que nous avons créé dans la règle AssignMessage précédente au service Google Geocoding, et enregistre le résultat dans une variable appelée GeocodingResponse.

Comme précédemment, examinons d'abord le code. Une explication détaillée suit. Pour en savoir plus sur cette règle, consultez la page Règle ServiceCallout. Dans l'exemple de téléchargement, vous trouverez ce code XML 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 éléments de cette règle.
- <ServiceCallout> : comme la règle précédente, celle-ci a un nom.
- <Request variable> : il s'agit de la variable créée dans la règle AssignMessage. Elle encapsule la requête adressée à l'API de backend.
- <Response> : cet élément nomme une variable dans laquelle la réponse est stockée. Comme vous le verrez, cette variable sera accessible ultérieurement par la règle ExtractVariables policy.
- <HTTPTargetConnection> : spécifie l'URL cible de l'API de backend API. Dans ce cas, nous spécifions que l'API renvoie une réponse JSON.
Nous avons maintenant deux règles : une qui spécifie les informations de requête nécessaires pour utiliser l' API de backend (l'API Google Geocoding) et une seconde qui envoie réellement la requête à l' API de 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 du message de réponse obtenu par une règle ServiceCallout. ExtractVariables peut être utilisé pour analyser du code JSON ou XML, ou pour extraire du contenu à partir de chemins d'URI, d'en-têtes HTTP, de paramètres de requête et de paramètres de formulaire.

Voici une liste de la règle ExtractVariables. Pour en savoir plus sur cette règle, consultez la page
Règle Extract Variables
policy. Dans l'exemple de téléchargement, vous trouverez ce code XML 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 éléments clés de la règle ExtractVariable sont les suivants :
- <ExtractVariables name> : encore une fois, le nom de la règle est utilisé pour faire référence à la règle lorsqu'elle est utilisée dans un flux.
- <Source> : spécifie la variable de réponse que nous avons créée dans la règle ServiceCallout. Il s'agit de la variable à partir de laquelle cette règle extrait des données.
- <VariablePrefix> : le préfixe de variable spécifie un espace de noms pour les autres variables créées dans cette règle. Le préfixe peut être n'importe quel nom, à l'exception des noms réservés définis par les variables prédéfinies de Edge's.
- <JSONPayload> : cet élément récupère les données de réponse qui nous intéressent et les place dans des variables nommées. En fait, l'API Geocoding renvoie beaucoup plus d'informations que la latitude et la longitude. Toutefois, ce sont les seules valeurs dont nous avons besoin pour cet exemple. Vous pouvez voir un rendu complet du code JSON renvoyé par l'API Geocoding dans la documentation de l'API. Les valeurs de geometry.location.lat et geometry.location.lng ne sont que deux des nombreux champs de l'objet JSON renvoyé.
Ce n'est peut-être pas évident, mais il est important de voir qu'ExtractVariables produit deux variables dont les noms se composent du préfixe de variable (geocoderesponse) et des noms de variables réels spécifiés dans la règle. Ces variables sont stockées dans le proxy d'API et seront disponibles pour d'autres règles dans le flux de proxy, comme vous le verrez. Les variables sont les suivantes :
- geocoderesponse.latitude
- geocoderesponse.longitude
La plus grande partie du travail est maintenant terminée. Nous avons créé un composite de trois règles qui forment une requête, appellent une API de backend et analysent les données JSON renvoyées. Dans les dernières étapes, nous allons transmettre les données de cette partie du flux à une autre règle AssignMessage, appeler la deuxième API de backend (API Google Elevation) et renvoyer nos données combinées au développeur d’applications.
Générer la deuxième requête avec AssignMessage
La règle AssignMessage suivante utilise les variables renvoyées par le premier backend (Google Geocoding) que nous avons stockées et les insère dans une requête destinée à la deuxième API (Google Elevation). Comme indiqué précédemment, ces variables sont geocoderesponse.latitude et geocoderesponse.longitude.
Dans l'exemple de téléchargement, vous trouverez ce code XML 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 verrez qu'elle accepte deux paramètres de requête.
Le premier 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
être défini sur "true" ou "false". Le point le plus important à noter à ce stade est que le message de requête
que nous créons ici ne nécessite pas de ServiceCallout. Nous n'avons pas besoin d'appeler la deuxième
API à partir d'un ServiceCallout à ce stade, car nous pouvons appeler l'API de backend à partir du TargetEndpoint du proxy. Si vous y réfléchissez, nous disposons de toutes les données dont nous avons besoin pour appeler l'API Google Elevations
Le message de requête généré à cette étape ne nécessite pas de ServiceCallout, car la
requête générée pour le pipeline de requête principal sera simplement transmise par le
ProxyEndpoint au TargetEndpoint, en suivant la RouteRule configurée pour ce proxy d'API.
Le TargetEndpoint gère la connexion avec l'API distante. (Rappelez-vous que l'URL de l'API Elevation est définie dans la HTTPConnection du TargetEndpoint. Documentation de l'API Elevation
si vous souhaitez en savoir plus. Les QueryParams 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 une autre règle ServiceCallout. Après
tout, nous avons créé un autre message. Comment ce message est-il envoyé à la cible, l'API Google
Elevation ? La réponse se trouve dans l'élément <RouteRule> du flux. <RouteRule>
spécifie ce qu'il faut faire avec les messages de requête restants une fois la partie <Request> de
le flux exécuté. Le TargetEndpoint spécifié par cette <RouteRule> indique au
proxy d'API de transmettre 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 code 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.
Convertir la réponse du format XML au format JSON
Dans cet exemple, la réponse de l'API Google Elevation est renvoyée au format XML. Pour aller plus loin, ajoutons une règle à notre composite pour transformer la réponse du format XML au format JSON.
Cet exemple utilise la règle JavaScript nommée GenerateResponse, avec un fichier de ressources contenant le code JavaScript, pour effectuer la conversion. Vous trouverez ci-dessous la définition de la règle 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
conversion. Vous pouvez voir ce code dans le
fichier doc-samples/policy-mashup-cookbook/apiproxy/resources/JSC/GenerateResponse.js.
Apigee fournit également une règle prête à l'emploi, XMLToJSON, pour convertir le format XML au format JSON. Vous pouvez
modifier le ProxyEndpoint pour utiliser la règle xmltojson présentée ci-dessous
à la place.
<XMLToJSON name="xmltojson"> <Options> </Options> <OutputVariable>response</OutputVariable> <Source>response</Source> </XMLToJSON>
Tester l'exemple
Si ce n'est pas déjà fait, essayez de télécharger, de déployer et d'exécuter l' exemple policy-mashup-cookbook , que vous trouverez dans le dossier doc-samples du dépôt d'exemples Apigee Edge sur GitHub. Il vous suffit de suivre les instructions du fichier README du dossier policy-mashup-cookbook. Vous pouvez également suivre les brèves instructions fournies sur la page Utiliser les exemples de proxy d'API.
Pour résumer, vous pouvez appeler l'API composite comme suit. Remplacez {myorg} par le nom de votre 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é à l'altitude de cet emplacement géocodé. Les données ont été récupérées à partir de deux API de backend, combinées à l'aide de règles associées au proxy d'API et renvoyées 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 de livre de recettes explique comment utiliser le modèle de composition de règles pour créer un mashup de données provenant de plusieurs sources de backend. La composition de règles est un modèle courant utilisé dans le développement de proxys d'API pour ajouter des fonctionnalités créativité à votre API.