viernes, 30 de septiembre de 2016

Consumir un API creada con el servicio SAP API Management de HCP

En mi entrada anterior contaba como podemos crear un proxy para un servicio REST usando el API Portal. Ahora veremos como podemos consumir esas APIs

"Descubriendo" las APIs

Una vez creado el proxy en el producto en el API Portal llega el momento de usar el Dev Portal.



En el Dev Portal podemos ver todos los productos publicados, y para cada producto las APIs que contiene:


Cada proxy nos muestra la documentación que le hayamos asignado desde el API Portal.

Suscripción a un API

Una vez encontrado el producto que queremos consumir, nos tenemos que suscribir a él:


La aplicación simplemente necesita un nombre y una descripción. Lo que pongamos aquí aparecerá también en el API Portal. De manera que la persona que creó el API puede ver que aplicaciones están suscritas a sus APIs y toda la información asociada:


Para ver nuestra aplicación:


Probar nuestra aplicación



Tenemos que asegurarnos de añadir a la cabecera la APIKEY (ya que al crear el API añadimos la "Plolicie" de que se verificara el apikey en la cabecera.)

Cuando creamos una aplicación y nos suscribimos a un API, el autor del API puede ver que aplicaciones se han suscrito a su servicio desde el API Portal.

Y algún día, hablaré de como usar estas APIs en una aplicación...


jueves, 22 de septiembre de 2016

Creación de un API en el servicio SAP API Management de HCP

SAP API Management en HCP

SAP API Management es un servicio en HCP que aparece como resultado de la colaboración entre SAP y APIGee (http://apigee.com/about/partner-story/sap); Esta utilidad permite desarrollar proxies para cualquier servicio que sea visible en internet y sea accesible mediante HTTP. (Pero aquí lo cuentan con mucho más detalle: http://scn.sap.com/docs/DOC-73783)

Primeros pasos

Aquí explican como tener acceso a este servicio: Free trial of SAP API Management on hana cloud platform is available now.

Podemos encontrar numerosos ejemplos de como crear un API a partir de un servicio OData (Por ejemplo: How to use SAP API Management on HCP trial) pero aquí voy a explicar como podemos crear un API a partir de un servicio REST cualquiera.

Entendiendo el servicio

El servicio SAP API Management necesita un servicio accesible desde web, en concreto SAP nos dice que soporta servicios OData, REST y SOAP. Todos estos servicios tienen una cosa en común, son accesibles mediante una llamada de este tipo:
HTTP(s)://servidor:puerto/prefijo/base/recurso
Por ejemplo, para el servicio de "address cleansing" (del que ya he hablado en este blog) tenemos la siguiente URL:
HTTPS://dqaasu23133c2f-<consumeraccount>.hanatrial.ondemand.com/dq/addressCleanse
Donde:
  • servidor =  dqaasu23133c2f-<consumeraccount>.hanatrial.ondemand.com
  • puerto = 443 (es el puerto por defecto para conexiones HTTPS a si que no hace falta indicarlo)
  • prefijo, ninguno, en este caso no tenemos prefijo
  • base = dq
  • recurso = addressCleanse
La idea es que servidor+puerto+prefijo es el lugar donde están TODAS las APIs de un determinado proveedor, y base+recurso es donde accedemos a cada API de forma individual. Siguiendo con el ejemplo del servicio de SAP para data quality, tenemos dos APIs:
  • Address Cleansing: https://dqaasu23133c2f-<consumeraccount>.hanatrial.ondemand.com/dq/addressCleanse
  • Reverse Geocode: https://dqaasu23133c2f-<consumeraccount>.hanatrial.ondemand.com/dq/reverseGeo
Las dos están en https://dqaasu23133c2f-<consumeraccount>.hanatrial.ondemand.com, y la forma de acceder a cada una de ellas es: /dq/addressCleanse y /dq/reverseGeo

Evidentemente podríamos haver considerado que "/dq" es el prefijo y que lo que está vacío es la base, o incluso que la base es "addressCleanse" y lo que está vacío es el recurso, pero cuando estemos creando el proxy en HCP veremos que lo que yo planteo es más cómodo.

¿Qué hace SAP con estos servicios OData, REST o SOAP? pues crea para ellos un proxy del tipo:
https://trial.apim1.hanatrial.ondemand.com:443/<cuentaHCP>/base
Donde "base" es la "base" de nuestro servicio original (Por eso la base no puede estar vacía y es obligatoria) y cada proxy tendrá varias APIs, tantas como recursos definamos (y por lo tanto el recurso no puede estar vacío)

Este proxy es el que se encargará de la gestión de cuotas de uso, seguridad, control de errores, etc.

Creación de un proxy

Una vez configurado el servicio (aquí, en la sección 1, explican como hacerlo con mucho detalle: Building & Consuming API's using SAP API Management (Part 1)) lanzamos el API Portal:


Y desde el API Portal, lanzamos la utilidad de crear API Providers:



Podemos considerar el API provider como el servidor donde se encuentran los servicios para los que queremos crear un API. En este ejemplo usaremos los Data Quality Microservices de SAP:






En el borrón negro va el usuario HCP, cada uno tiene que usar el suyo. 

Abajo a la izquierda encontramos el botón de guardar (Save)

El paso siguiente es crear el API Proxy:




Estamos indicando, dentro del servidor creado en el paso anterior, en que URL están los servicios, en nuestro caso esa URL es dq. Pulsamos en "Create" y vamos a por la última parte. Crear los "resources" que, por fin, son la API propiamente dicha:




Y al pulsar en "Add" tenemos creado el recurso dentro de nuestro proxy:


Para añadir mas "resources" solo tenemos que volver a pulsar en "Add". Para guardar nuestra API tenemos abajo a la derecha dos botones: "Sava As Draft", que guarda la configuración pero no la crea en el HCP, y "Save And Deploy", que guarda la configuración y crea el proxy en HCP. Importante, hasta que no hagamos el deploy no existirá nuestra API.


Una vez realizado el deploy, llega el momento de probar nuestro trabajo:



En este caso estoy usando los datos de ejemplo de mi artículo sobre el microservicio de calidad de datos. Para poder incluir parámetros en la cabecera tenemos que pulsar el botón "Headers". Una vez que tengamos todos los datos de test solo tenemos que pulsar en botón que tenemos en la parte de abajo a la derecha "Send" para poder ver el resultado de la llamada a nuestra API:

Añadiendo funcionalidad al API proxy

Ahora mismo nuestro proxy no aporta nada más que un entorno de test para el servicio REST, pero para poder aprovechar realmente el potencial de SAP API Management tenemos que usar las "Policies":





Las "Policies" (políticas o normas) nos van a permitir a realizar acciones sobre el mensaje ANTES de que la llamada llegue al servicio (PreFlow) o DESPUES de la ejecución del servicio (PostFlow). Como ejemplo vamos a añadir la regla de que se verifique la clave de API (API Key) es decir, que para usar nuestra api tenga que existir una suscripción a la misma en el servicio de HCP:




Para facilitar los ejemplos en este Blog, he cambiado el script para que la API Key se lea de la cabecera: "<APIKey ref='request.header.APIKey'/>"

Pulsamos en "Update" abajo a la derecha y ya tenemos nuestra "Policie" añadida. Importante pulsar en "Save" en la pantalla de la API, o de lo contrario perderemos nuestra "Poicie".

Al añadir esta regla, no podremos volver a probar nuestro API en el portal de APIs (API Portal) ya que nos dará el error de que falta el APIKey.

Publicar el API

Nuestros API los creamos para que puedan ser consumidos desde el portal de Gestión de desarrollos (Dev Portal). Para que esto sea posible tenemos que crear un "Product"






Después de todo esto, pulsamos en "Publish" abajo a la derecha y ya tenemos listo nuestro producto para ser consumido desde el "Dev Portal".

Como esta entrada del Blog ya ha quedado demasiado larga, dejo la parte del "Dev Portal" para otro artículo.

viernes, 16 de septiembre de 2016

Data Quality Microservices en SAP HCP

SAP Data Quality as a Service (DQaaS)

SAP ofrece, en fase BETA, un servicio de gestión de calidad de datos centrado, en este caso, en direcciones físicas y geolocalización (Más datos, y como activarlo, en New HCP Service (Beta) - SAP Data Quality Management, microservices for location data)

Como usarlo

Una vez activado, lo que tenemos son dos servicios REST en las siguientes URLs:

Gestión de direcciones y obtención de coordenadas

https://dqaasu23133c2f-<consumeraccount>.hanatrial.ondemand.com/dq/addressCleanse
(Detalles en: Address Cleanse)

Ejemplo de una llamada solicitando la revisión de una dirección (algunos datos se sustituyen por XXX por motivos de privacidad) :
{
  "addressInput": {
    "mixed": "Avenida Europa, XX X - 2 Planta",
    "locality": "Madrid",
    "postcode": "",
    "country": "ES"
  },
  "outputFields": [
    "std_addr_address_delivery",
    "std_addr_address_dual",
    "std_addr_locality_full",
    "std_addr_region_full",
    "std_addr_postcode_full",
    "std_addr_country_name",
    "std_addr_country_2char",
    "addr_info_code"
  ],
  "addressSettings": {
    "casing": "mixed",
    "diacritics": "include",
    "scriptConversion": "none",
    "streetFormat": "countryCommonStyle",
    "postalFormat": "countryCommonStyle",
    "regionFormat": "countryCommonStyle"
  }
}
Que daría la siguiente respuesta:
{
     "std_addr_region_full": "Madrid",
     "addr_info_code": "",
     "std_addr_country_name": "España",
     "std_addr_address_delivery": "avenida Europa,
  XX - Planta 2 - X",
     "std_addr_postcode_full": "28023",
     "std_addr_address_dual": "",
     "std_addr_locality_full": "Madrid",
     "std_addr_country_2char": "ES"
}
El servicio permite también obtener las coordenadas geográficas de una dirección:
Llamada (algunos datos se sustituyen por XXX por motivos de privacidad):
{
  "addressInput": {
    "mixed": "Avenida Europa, XX X - 2 Planta",
    "locality": "Madrid",
    "postcode": "",
    "country": "ES"
  },
  "outputFields": [
    "std_addr_address_delivery",
    "std_addr_address_dual",
    "std_addr_locality_full",
    "std_addr_region_full",
    "std_addr_postcode_full",
    "std_addr_country_name",
    "std_addr_country_2char",
    "addr_info_code",
    "addr_latitude",
    "addr_longitude",
    "geo_asmt_level",
    "geo_info_code",
    "geo_info_code_msg"
  ],
  "addressSettings": {
    "casing": "mixed",
    "diacritics": "include",
    "scriptConversion": "none",
    "streetFormat": "countryCommonStyle",
    "postalFormat": "countryCommonStyle",
    "regionFormat": "countryCommonStyle"
  }
}

Respuesta:
{
     "geo_info_code": "",
     "std_addr_address_dual": "",
     "std_addr_postcode_full": "28023",
     "addr_longitude": -3.7865980000000001,
     "std_addr_country_2char": "ES",
     "std_addr_region_full": "Madrid",
     "addr_info_code": "",
     "std_addr_country_name": "España",
     "std_addr_address_delivery": "avenida Europa,
  XX - Planta 2 - X",
     "geo_info_code_msg": "",
     "geo_asmt_level": "PRE",
     "std_addr_locality_full": "Madrid",
     "addr_latitude": 40.445582000000002
}

Geolocalización

https://dqaasu23133c2f-<consumeraccount>.hanatrial.ondemand.com/dq/reverseGeo
(Detalles en: Reverse Geocoding)

Ejemplo de una llamada solicitando las posibles direcciones de unas coordenadas geográficas:
{
  "geoInput": {
    "latitude":  40.445582000000002,
    "longitude":  -3.7865980000000001
  },
  "outputFields": [
    "geo_info_code",
    "geo_info_code_msg",
    "geo_search_results_count",
    "geo_search_results"
   ],
  "geoSettings": {
    "radius": 0.5,
    "distanceUnit": "kilometers",
    "maxRecords": 3
  }
}

Respuesta:
{
     "geo_search_results": [
      {
             "search_geo_locality2": "",
             "search_geo_postcode_full": "28023",
             "search_geo_addr_latitude": 40.445582,
             "search_geo_distance": 0.0000,
             "search_geo_locality": "MADRID",
             "search_geo_poi_name": "CELMART",
             "search_geo_group_master": "",
             "search_geo_country_2char": "ES",
             "search_geo_address_delivery": "AVENIDA DE EUROPA 34",
             "search_geo_side_of_street": "L",
             "search_geo_poi_type": "7315,
            044",
             "search_geo_asmt_level": "PRE",
             "search_geo_region": "",
             "search_geo_group_id": null,
             "search_geo_population_class": "1",
             "search_geo_addr_longitude": -3.786598
        },
      {
             "search_geo_locality2": "",
             "search_geo_addr_latitude": 40.445593,
             "search_geo_postcode_full": "28023",
             "search_geo_distance": 0.0012,
             "search_geo_locality": "MADRID",
             "search_geo_poi_name": "",
             "search_geo_group_master": "",
             "search_geo_country_2char": "ES",
             "search_geo_address_delivery": "AVENIDA DE EUROPA",
             "search_geo_poi_type": "",
             "search_geo_side_of_street": "L",
             "search_geo_asmt_level": "PRI",
             "search_geo_region": "",
             "search_geo_group_id": null,
             "search_geo_population_class": "1",
             "search_geo_addr_longitude": -3.786598
        },
      {
             "search_geo_locality2": "",
             "search_geo_addr_latitude": 40.445473,
             "search_geo_postcode_full": "28023",
             "search_geo_distance": 0.0121,
             "search_geo_locality": "MADRID",
             "search_geo_poi_name": "",
             "search_geo_group_master": "",
             "search_geo_country_2char": "ES",
             "search_geo_address_delivery": "AVENIDA DE EUROPA 27",
             "search_geo_poi_type": "",
             "search_geo_side_of_street": "R",
             "search_geo_asmt_level": "PRI",
             "search_geo_region": "",
             "search_geo_group_id": null,
             "search_geo_population_class": "1",
             "search_geo_addr_longitude": -3.786593
        }
    ],
     "geo_info_code": "",
     "geo_info_code_msg": "",
     "geo_search_results_count": 3
}

Este servicio no dispone, por ahora, de ningún tipo de información o control sobre cuotas de uso, seguridad, usuarios, rendimiento, etc... Pero podemos añadírselo usando el servicio SAP API Management (del lo que hablo justo AQUI).