Usa la composición de políticas

Estás viendo la documentación de Apigee Edge.
Ve a la Documentación de Apigee X.
información

En este tema, aprenderás a crear una 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 varias objetivos en una sola respuesta mediante 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 la Guía de soluciones del proxy de API patrones.

Descarga y prueba el código de muestra

Acerca de este ejemplo de libro de recetas

En este ejemplo de la guía de soluciones, se ilustra un patrón del proxy de API llamado composición de políticas. Este patrón proporciona una forma (existen otras) para combinar datos de varias fuentes de backend. En términos más generales, este tema demuestra cómo las políticas se pueden combinar y encadenar para producir el resultado deseado. Para obtener un panorama general de este patrón y otros relacionados, consulta Guía de soluciones del proxy de API patrones.

En el ejemplo que se analiza aquí, se usa la composición de políticas para combinar datos de estos dos APIs públicas:

  • El plan de Google Geocoding API: Esta API convierte direcciones (como “1600 Amphitheatre Parkway, Mountain View, CA”) en coordenadas geográficas (como latitud 37.423021 y longitud -122.083739).
  • La elevación de Google API Esta API proporciona una interfaz sencilla para realizar consultas sobre ubicaciones de la Tierra y determinar la elevación. de datos no estructurados. En este ejemplo, las coordenadas que muestra la API de Geocoding se usarán como entrada a esta API.

Los desarrolladores de apps llamarán a este proxy de API con dos parámetros de búsqueda: un código postal y un país. ID:

$ 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 y longitud) de centro del área del código postal proporcionada combinado con la elevación a la que se ubicación.

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

Antes de comenzar

Si deseas leer una descripción general breve del patrón de composición de políticas, consulta la sección "La política patrón de composición" en la Guía de soluciones del proxy de API patrones.

Antes de explorar este ejemplo de libro de cocina, también deberías conocer conceptos:

  • Qué son las políticas y cómo adjuntarlas a los proxies Para una buena introducción a las políticas, consulta ¿Qué es un ?.
  • La estructura de un flujo del 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, varias se crean y 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 la API. Este tema de la guía de soluciones demuestra el desarrollo local (archivo basado en el sistema), a diferencia 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 la clave de API. Esta es la forma más simple de seguridad basada en apps que puedes que debes configurar para una API. Para obtener más información, consulta la página claves. También puedes consultar la pestaña Secure una API mediante la solicitud de claves de API.
  • Conocimientos prácticos de XML En este ejemplo, compilamos el proxy de API y su políticas con archivos en formato XML que residen en el sistema de archivos.

Si descargaste el código de muestra, puedes localizar todos los archivos mencionados en esta de la carpeta de muestra mashup-policy-cookbook. Las siguientes secciones analizaremos el código de muestra en detalle.

Sigue la corriente

Antes de pasar a las políticas, veamos el flujo principal proxy de API. El XML de flujo, que se muestra a continuación, nos brinda mucha información sobre este proxy, las políticas que usos 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>

Este es un resumen de los elementos del flujo.

  • &lt;Request&gt;: La <Request> consta de varios elementos &lt;Step&gt; o de terceros. Cada paso llama a una de las políticas que crearemos en el resto de este tema. Estas políticas se encargan de crear un mensaje de solicitud, enviarlo y analizando la respuesta. Al final de este tema, comprenderás la función de cada uno de ellos. y políticas de seguridad.
  • &lt;Response&gt;: <Response> también incluye <Pasos>. Estos pasos también llaman a las políticas responsables de procesar final desde el extremo de destino (la API de Elevation de Google).
  • &lt;HttpProxyConnection&gt;: este elemento especifica detalles sobre cómo se conectarán las apps a este proxy de API, incluida <BasePath>, que especifica la se llamará a esta API.
  • &lt;RouteRule&gt;: este elemento especifica lo que sucede inmediatamente. después de que se procesan los mensajes de solicitud entrantes. En este caso, se llama al TargetEndpoint. Analizaremos 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 conforman esta composición de políticas ejemplo.

Crea el primer cada vez que se realiza una asignación política

La primera política AssignMessage, que se muestra a continuación, crea un mensaje de solicitud que se enviará al servicio.

Comencemos con el código de la política y, luego, explicaremos sus elementos en 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 incluye una breve descripción de los elementos de esta política. Obtén más información al respecto en la sección Asignar Política de mensajes.

  • <AssignMessage name>: Asigna un nombre a esta política. El nombre es se usa cuando se hace referencia a la política en un flujo.
  • &lt;AssignTo&gt;: Crea una variable con nombre llamada GeocodingRequest. Esta variable encapsula el objeto de la solicitud que enviará el backend al backend Política ServicePrompt.
  • &lt;QueryParams&gt;: 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 es expresada con un código postal y un ID de país. El usuario de la aplicación proporciona esta información. solo lo extraemos aquí. El parámetro sensor es obligatorio para la API y se verdadero o falso, y lo codificamos como falso aquí.
  • &lt;Verb&gt;. En este caso, se realiza una solicitud GET simple al en la API de Cloud.
  • &lt;AssignVariable&gt;: estas variables almacenan los valores que se reciben. pasando a la API. En este ejemplo, se accederá a las variables más adelante en la respuesta. mostrar al cliente.

Envía la solicitud con ServiceCallout

El siguiente paso en la secuencia de composición de la política es crear una política ServiceCallout. El La política ServiceCallout, que se indica a continuación, envía el objeto de solicitud que creamos en la la política AssignMessage anterior al servicio Geocoding de Google y se 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. Pueden leer más información sobre esta política en Texto destacado de servicios 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 incluye una breve descripción de los elementos de esta política.

  • &lt;ServiceCallout&gt;: al igual que con la política anterior, esta incluye de la fuente de datos.
  • <Variable de solicitud>: es la variable que se creó en con la políticaAssignMessage. Encapsula la solicitud que se dirige a la API de backend.
  • &lt;Response&gt;: este elemento nombra una variable en la que la respuesta cuando se almacena. Como verás, el ExtractVariables accederá a esta variable más adelante política de la empresa.
  • &lt;HTTPTargetConnection&gt;: especifica la URL de destino del backend. en la API de Cloud. 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 de backend (API de Geocoding de Google), y la segunda que envía la solicitud a la API de backend. A continuación, manejaremos la respuesta.

Analiza la respuesta con ExtractVariables

La política ExtractVariables proporciona un mecanismo simple para analizar el contenido del mensaje de respuesta obtenido por una política ServicePrompt. ExtractVariables se pueden usar para analizar JSON o XML, o se puede usar para extraer contenido de rutas de URI, encabezados HTTP, consultas parámetros y parámetros de formulario.

Esta es una lista de la política ExtractVariables. Puedes leer más sobre esta política en Extraer variables política. 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>: Nuevamente, el nombre de la política se usa para consulta la política cuando se usan en un flujo.
  • &lt;Source&gt;: especifica la variable de respuesta que creamos en la política ServicePrompt. Esta es la variable de la que esta política extrae datos.
  • &lt;VariablePrefix&gt;: El prefijo de variable especifica un espacio de nombres para otras variables creadas en esta política. El prefijo puede ser cualquier nombre, excepto el nombre reservado definidos por la ruta de aprendizaje variables predefinidas.
  • &lt;JSONPayload&gt;: este elemento recupera los datos de respuesta que se que nos interesan y lo coloca en variables con nombre. De hecho, la API de Geocoding proporciona 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 renderización completa del JSON que muestra la API de Geocoding. en las APIs documentación. Los valores de geo.location.lat y geometría.location.lng simplemente son dos de los numerosos campos en el objeto JSON que se devuelve.

Puede no ser obvio, pero es importante ver que ExtractVariables produce dos variables cuyos nombres constan del prefijo de la variable (georesponse) y el código de variables que se especifican en la política. Estas variables se almacenan proxy de API y estará disponible para otras políticas dentro del flujo del proxy, ver. Las variables son las siguientes:

  • geocoderesponse.latitude
  • geocoderesponse.longitude

Ahora, la mayor parte del trabajo está terminado. Creamos un compuesto de tres políticas que forman llamar a una API de backend y analizar los datos JSON que se muestran. En los últimos pasos, le enviaremos datos de esta parte del flujo en otra política deAssignMessage, llama al segundo backend (API de Google Elevation), y devolver nuestros datos combinados al desarrollador de la app.

Genera el segundo solicitud conassignMessage

La siguiente política deAssignMessage usa variables devueltas desde el primer backend (Google geocodificación) que almacenamos y los inserta en una solicitud destinada a la segunda API (Google elevación). Como se indicó anteriormente, estas variables son georesponse.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 Google Elevation API, 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 puede ser verdadero o falso. Lo más importante que se debe tener en cuenta en este punto es que la solicitud del mensaje que creamos aquí no requiere un ServiceTexto destacado. No necesitamos llamar a la segunda API de un ServicePrompt de servicio en este punto porque podemos llamar a la API de backend desde la API de TargetEndpoint. Si lo piensas, tenemos todos los datos que necesitamos para llamarlos Elevaciones de Google API El mensaje de solicitud generado en este paso no requiere un ServicePrompt, ya que el para la canalización de la solicitud principal. Por lo tanto, la reenvía ProxyEndpoint al TargetEndpoint, siguiendo la RouteRule configurada para este proxy de API. TargetEndpoint administra la conexión con la API remota. (Recuerda que la URL de la Elevation se define en HTTPConnection para el TargetEndpoint. API de Elevation documentación, 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í.

Pausa breve: Volver al flujo

En este punto, es posible que te preguntes por qué no estamos creando otra política ServiceCallout. Después del creamos otro mensaje. ¿Cómo se envía ese mensaje al destino, al servicio ¿API de Elevation? La respuesta está en <RouteRule> del flujo. &lt;RouteRule&gt; especifica qué hacer con los mensajes de solicitud restantes después de <Request> parte de se ejecutó el flujo. El TargetEndpoint especificado por esta <RouteRule> le dice al proxy de API para entregar el mensaje a http://maps.googleapis.com/maps/api/elevation/xml.

Si descargaste el proxy de API de muestra, podrás 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 debemos procesar la respuesta de la Google Elevation API. listo.

Convierte la respuesta de XML a JSON

En este ejemplo, la respuesta de la Google Elevation API se muestra como XML. Para los clientes potenciales crédito", agreguemos una política más a nuestro compuesto para transformar la respuesta de XML a JSON

En este ejemplo, se usa la política de JavaScript denominada GenerateResponse, con un archivo de recursos que contiene el código 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 código JavaScript usado para realizar la conversión. Puedes ver ese código en la 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 en JSON. Puedes Edita 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 has hecho, intenta descargar, implementar y ejecutar la La muestra de policy-mashup-cookbook, que puedes encontrar en la carpeta doc-samples en el repositorio de muestras de Apigee Edge de GitHub. Justo sigue las instrucciones del archivo README en la carpeta policy-mashup-cookbook. O sigue estas breves instrucciones: Cómo utilizar los proxies de API de muestra.

En resumen, puedes llamar a la API compuesta de la siguiente manera. Sustituya su {myorg} por su nombre de la 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 aplicación, en combinación con la elevación de esa ubicación geocodificada. Los datos fueron recuperado de dos APIs de backend, combinado con políticas adjuntas al proxy de API mostrar 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 explica cómo usar el patrón de composición de políticas para crear una mashup de datos de múltiples fuentes de backend. La composición de políticas es un patrón común que se usa en la API y el desarrollo de proxy para agregar funciones de creatividad a la API.