Estás viendo la documentación de Apigee Edge.
Ir a la
documentación de Apigee X. info
En este tema, aprenderás a crear un mashup con la composición de políticas. La composición de políticas es un patrón de proxy de Apigee que te permite combinar resultados de varios destinos de backend en una sola respuesta con políticas.
Para obtener una descripción general de la composición de políticas, consulta "El patrón de composición de políticas" en Patrones de la guía de soluciones del proxy de API.
Descarga y prueba el código de muestra
Acerca de este ejemplo de la guía de soluciones
En este ejemplo de la guía de soluciones, se ilustra un patrón de proxy de API llamado composición de políticas. Este patrón proporciona una forma (hay otras) de combinar datos de varias fuentes de backend. En términos más generales, en este tema, se muestra cómo se pueden combinar y encadenar las políticas para producir el resultado deseado. Para obtener una descripción general de este patrón y otros relacionados, consulta Patrones de la guía de soluciones del proxy de API.
En el ejemplo que se analiza aquí, se usa la composición de políticas para combinar datos de estas dos APIs públicas independientes:
- La API de Geocoding de Google: Esta API convierte direcciones (como "1600 Amphitheatre Parkway, Mountain View, CA") en coordenadas geográficas (como latitud 37.423021 y longitud -122.083739).
- La API de Elevation de Google: Esta API proporciona una interfaz sencilla para realizar consultas sobre ubicaciones de la Tierra y obtener datos acerca de la elevación. En este ejemplo, las coordenadas que muestra la API de Geocoding se usarán como entrada en esta API.

Los desarrolladores de apps llamarán a este proxy de API con dos parámetros de consulta, un código postal y un ID de país:
$ curl "http://{myorg}-test.apigee.net/policy-mashup-cookbook?country=us&postalcode=08008"
La respuesta es un objeto JSON que incluye la ubicación geocodificada (latitud/longitud) para el centro del área del código postal proporcionado, combinada con la elevación en esa ubicación geocodificada
{
"ElevationResponse":{
"status":"OK",
"result":{
"location":{
"lat":"39.7500713",
"lng":"-74.1357407"
},
"elevation":"0.5045232",
"resolution":"76.3516159"
}
}
}Antes de comenzar
Si deseas leer una breve descripción general del patrón de composición de políticas, consulta "El patrón de composición de políticas" en Patrones de la guía de soluciones del proxy de API.
Antes de explorar este ejemplo de la guía de soluciones, también debes familiarizarte con estos conceptos fundamentales:
- Qué son las políticas y cómo adjuntarlas a los proxies. Para obtener una buena introducción a las políticas, consulta ¿Qué es una política?.
- La estructura de un flujo de proxy de API, como se explica en Configura flujos. Los flujos te permiten especificar la secuencia en la que un proxy de API ejecuta las políticas. En este ejemplo, se crean varias políticas y se agregan al flujo del proxy de API.
- Cómo se organiza un proyecto de proxy de API en tu sistema de archivos, como se explica en Referencia de configuración del proxy de API. En este tema de la guía de soluciones, se muestra el desarrollo local (basado en el sistema de archivos) en lugar del desarrollo basado en la nube, en el que podrías usar la IU de administración para desarrollar el proxy de API.
- Uso de la validación de claves de API. Esta es la forma más simple de seguridad basada en aplicaciones que puedes configurar para una API. Para obtener más información, consulta Claves de API. También puedes consultar el instructivo Protege una API mediante la solicitud de claves de API.
- Conocimientos prácticos de XML. En este ejemplo, compilamos el proxy de API y sus políticas con archivos XML que residen en el sistema de archivos.
Si descargaste el código de muestra, puedes ubicar todos los archivos que se analizan en este tema en la carpeta de muestra mashup-policy-cookbook. En las siguientes secciones , se analiza el código de muestra en detalle.
Fluyo con la corriente
Antes de pasar a las políticas, echemos un vistazo al flujo principal de nuestro proxy de API de ejemplo. El XML de flujo, que se muestra a continuación, nos dice mucho sobre este proxy, las políticas que usa y dónde se llaman esas políticas.
En la descarga de muestra, puedes encontrar este XML en el archivo
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>
A continuación, se muestra un resumen de los elementos del flujo.
- <Request> : El elemento <Request> consta de varios elementos <Step>. Cada paso llama a una de las políticas que crearemos durante el resto de este tema. Estas políticas se relacionan con la creación de un mensaje de solicitud, su envío y el análisis de la respuesta. Al final de este tema, comprenderás el rol de cada una de estas políticas.
- <Response> : El elemento <Response> también incluye <Steps>. Estos pasos también llaman a políticas que son responsables de procesar la respuesta final del extremo de destino (la API de Elevation de Google).
- <HttpProxyConnection> : Este elemento especifica detalles sobre cómo las apps se conectarán a este proxy de API, incluido el <BasePath>, que especifica cómo se llamará a esta API.
- <RouteRule> : Este elemento especifica lo que sucede inmediatamente después de que se procesan los mensajes de solicitud entrantes. En este caso, se llama a TargetEndpoint. Analizaremos más sobre este paso importante más adelante en este tema.
Crea las políticas
En las siguientes secciones, se analiza cada una de las políticas que componen este ejemplo de composición de políticas.
Crea la primera política AssignMessage
La primera política AssignMessage, que se muestra a continuación, crea un mensaje de solicitud que se enviará al servicio de Geocoding de Google.

Comencemos con el código de política y, luego, explicaremos sus elementos con más detalle. En la
descarga de muestra, puedes encontrar este XML en el archivo
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>
A continuación, se muestra una breve descripción de los elementos de esta política. Puedes obtener más información sobre esta política en Política AssignMessage.
- <AssignMessage name>: Le da un nombre a esta política. El nombre se usa cuando se hace referencia a la política en un flujo.
- <AssignTo> : Crea una variable con nombre llamada GeocodingRequest. Esta variable encapsula el objeto de solicitud que la política ServiceCallout enviará al backend.
- <QueryParams> : Establece los parámetros de consulta que necesita la llamada a la API de backend. En este caso, la API de Geocoding necesita conocer la ubicación, que se
expresa con un código postal y un ID de país. El usuario de la app proporciona esta información, y
nosotros simplemente la extraemos aquí. La API requiere el parámetro
sensor, que es verdadero o falso, y aquí lo codificamos como falso. - <Verbo> : En este caso, realizamos una solicitud GET simple a la API.
- <AssignVariable> : Estas variables almacenan los valores que estamos pasando a la API. En este ejemplo, se accederá a las variables más adelante en la respuesta que se muestra al cliente.
Envía la solicitud con ServiceCallout
El siguiente paso en la secuencia de composición de políticas es crear una política ServiceCallout. La política ServiceCallout, que se muestra a continuación, envía el objeto de solicitud que creamos en la política AssignMessage anterior al servicio de Geocoding de Google y guarda el resultado en una variable llamada GeocodingResponse.

Como antes, primero echemos un vistazo al código. A continuación, se incluye una explicación detallada. Puedes obtener
más información sobre esta política en Política Service Callout
política. En la descarga de muestra, puedes encontrar este XML en el archivo
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>
A continuación, se muestra una breve descripción de los elementos de esta política.
- <ServiceCallout> : Al igual que la política anterior, esta tiene un nombre.
- <Request variable> : Esta es la variable que se creó en la política AssignMessage. Encapsula la solicitud que va a la API de backend.
- <Response> : Este elemento nombra una variable en la que se almacena la respuesta. Como verás, la política ExtractVariables accederá a esta variable más adelante.
- <HTTPTargetConnection> : Especifica la URL de destino de la API de backend API. En este caso, especificamos que la API muestre una respuesta JSON.
Ahora tenemos dos políticas: una que especifica la información de solicitud necesaria para usar la API de backend (la API de Geocoding de Google) y la segunda que envía la solicitud a la API de backend. A continuación, controlaremos la respuesta.
Analiza la respuesta con ExtractVariables
La política ExtractVariables proporciona un mecanismo simple para analizar el contenido del mensaje de respuesta que obtiene una política ServiceCallout. ExtractVariables se puede usar para analizar JSON o XML, o para extraer contenido de rutas de URI, encabezados HTTP, parámetros de consulta y parámetros de formulario.

A continuación, se muestra una lista de la política ExtractVariables. Puedes obtener más información sobre esta política en
Política de extracción de variables
policy. En la descarga de muestra, puedes encontrar este XML en el archivo
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>
Los elementos clave de la política ExtractVariable son los siguientes:
- <ExtractVariables name> : Una vez más, el nombre de la política se usa para hacer referencia a la política cuando se usa en un flujo.
- <Source> : Especifica la variable de respuesta que creamos en la política ServiceCallout. Esta es la variable de la que esta política extrae datos.
- <VariablePrefix> : El prefijo de variable especifica un espacio de nombres para otras variables creadas en esta política. El prefijo puede ser cualquier nombre, excepto los nombres reservados definidos por las variables predefinidas de Edge.
- <JSONPayload> : Este elemento recupera los datos de respuesta que nos interesan y los coloca en variables con nombre. De hecho, la API de Geocoding muestra mucha más información que la latitud y la longitud. Sin embargo, estos son los únicos valores que necesitamos para esta muestra. Puedes ver una representación completa del JSON que muestra la API de Geocoding en la documentación de la API. Los valores de geometry.location.lat y geometry.location.lng son simplemente dos de los muchos campos del objeto JSON que se muestra.
Es posible que no sea obvio, pero es importante ver que ExtractVariables produce dos variables cuyos nombres constan del prefijo de variable (geocoderesponse) y los nombres de variable reales que se especifican en la política. Estas variables se almacenan en el proxy de API y estarán disponibles para otras políticas dentro del flujo del proxy, como verás. Las variables son las siguientes:
- geocoderesponse.latitude
- geocoderesponse.longitude
La mayor parte del trabajo ya está hecha. Creamos una composición de tres políticas que forman una solicitud, llaman a una API de backend y analizan los datos JSON que se muestran. En los pasos finales, ingresaremos datos de esta parte del flujo en otra política AssignMessage, llamaremos a la segunda API de backend (API de Elevation de Google) y mostraremos nuestros datos combinados al desarrollador de apps.
Genera la segunda solicitud con AssignMessage
La siguiente política AssignMessage usa variables que se muestran desde el primer backend (Google Geocoding) que almacenamos y las conecta a una solicitud destinada a la segunda API (Google Elevation). Como se mencionó anteriormente, estas variables son geocoderesponse.latitude y geocoderesponse.longitude.
En la descarga de muestra, puedes encontrar este XML en el archivo
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 examinas la API de Elevation de Google, verás que toma dos parámetros de consulta.
El primero se llama locations y su valor es la latitud y la longitud
(valores separados por comas). El otro parámetro es sensor, que es obligatorio y debe
ser verdadero o falso. Lo más importante que debes tener en cuenta en este punto es que el mensaje de solicitud
que creamos aquí no requiere un ServiceCallout. No necesitamos llamar a la segunda
API desde un ServiceCallout en este punto porque podemos llamar a la API de backend desde el TargetEndpoint del proxy. Si lo piensas, tenemos todos los datos que necesitamos para llamar a la API de Elevation de Google
El mensaje de solicitud generado en este paso no requiere un ServiceCallout, ya que la
solicitud generada para la canalización de solicitud principal, por lo que el ProxyEndpoint simplemente la reenviará al TargetEndpoint, siguiendo la RouteRule configurada para este proxy de API.
El TargetEndpoint administra la conexión con la API remota. (Recuerda que la URL de la
API de Elevation se define en HTTPConnection para el TargetEndpoint. Documentación de la API de Elevation
si deseas obtener más información. Los QueryParams que almacenamos anteriormente,
country y postalcode, ya no son necesarios, por lo que los quitamos
aquí.
Breve pausa: Volver al flujo
En este punto, es posible que te preguntes por qué no creamos otra política ServiceCallout. Después de
todo, creamos otro mensaje. ¿Cómo se envía ese mensaje al destino, la API de Elevation de Google
? La respuesta está en el elemento <RouteRule> del flujo. <RouteRule>
especifica qué hacer con los mensajes de solicitud restantes después de que se ejecuta la parte <Request> de
el flujo. El TargetEndpoint especificado por este <RouteRule> le indica al
proxy de API que entregue el mensaje
a http://maps.googleapis.com/maps/api/elevation/xml.
Si descargaste el proxy de API de muestra, puedes encontrar el XML de TargetProxy en el archivo
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>
Ahora, solo necesitamos procesar la respuesta de la API de Elevation de Google y listo.
Convierte la respuesta de XML a JSON
En este ejemplo, la respuesta de la API de Elevation de Google se muestra como XML. Para obtener "crédito adicional," agreguemos una política más a nuestra composición para transformar la respuesta de XML a JSON.
En este ejemplo, se usa la política de JavaScript llamada GenerateResponse, con un archivo de recursos que contiene el código de JavaScript, para realizar la conversión. A continuación, se muestra la definición de la política GenerateResponse:
<Javascript name="GenerateResponse" timeout="10000"> <ResourceURL>jsc://GenerateResponse.js</ResourceURL> </Javascript>
El archivo de recursos GenerateResponse.js incluye el JavaScript que se usa para realizar la
conversión. Puedes ver ese código en el
archivo doc-samples/policy-mashup-cookbook/apiproxy/resources/JSC/GenerateResponse.js.
Apigee también proporciona una política lista para usar, XMLToJSON, para convertir XML a JSON. Puedes
editar el ProxyEndpoint para usar la política xmltojson que se muestra a continuación
en su lugar.
<XMLToJSON name="xmltojson"> <Options> </Options> <OutputVariable>response</OutputVariable> <Source>response</Source> </XMLToJSON>
Prueba el ejemplo
Si aún no lo hiciste, intenta descargar, implementar y ejecutar la muestra policy-mashup-cookbook , que puedes encontrar en la carpeta doc-samples del repositorio de muestras de Apigee Edge en GitHub. Solo sigue las instrucciones del archivo README en la carpeta policy-mashup-cookbook. O bien, sigue las instrucciones breves aquí: Usa los proxies de API de muestra.
En resumen, puedes llamar a la API compuesta de la siguiente manera. Reemplaza {myorg} por el nombre de tu organización:
$ curl "http://{myorg}-test.apigee.net/policy-mashup-cookbook?country=us&postalcode=08008"
La respuesta incluye la ubicación geocodificada para el centro del código postal proporcionado por el usuario final de la app, combinada con la elevación en esa ubicación geocodificada. Los datos se recuperaron de dos APIs de backend, se combinaron con políticas adjuntas al proxy de API y se mostraron al cliente en una sola respuesta.
{ "country":"us", "postalcode":"08008", "elevation":{ "meters":0.5045232, "feet":1.6552599030345978 }, "location":{ "latitude":39.75007129999999, "longitude":-74.1357407 } }
Resumen
En este tema de la guía de soluciones, se explicó cómo usar el patrón de composición de políticas para crear un mashup de datos de varias fuentes de backend. La composición de políticas es un patrón común que se usa en el desarrollo de proxies de API para agregar funciones creativas a tu API.