Integrarse con una API externa: OneSignal

Solapas principales

Studio, Caché

¡Hola a tod@s!

En este artículo se exponen los pasos a seguir con el objetivo de crear una integración para consumir una API que nos permita crear notificaciones push, las cuales enviar mediante una aplicación móvil.

 

Vamos a usar OneSignal: https://onesignal.com/

 

Lo primero que hacemos es registrarnos de forma gratuita y así obtendremos la key.

 

A continuación, usaremos POSTMAN para enviar peticiones. En nuestro caso, vamos a centrarnos en AñadirDispositivos, que nos permite registrar un ID para el móvil o tablet en la cual el usuario haya aceptado recibir notificaciones.

 

Como inicio, necesitamos crearnos una “app”. En la web, arriba a la izquierda, veremos la opción para ello:

 

Luego, si queremos probar desde POSTMAN el ver la app recién creada, lo hacemos de la siguiente forma. Debemos localizar la User Auth Key (la cual se encuentra disponible pulsando en nuestra foto de perfil en la web de OneSignal).

 

Con ella enviamos una petición, donde en Headers ponemos: Content-Type application/json y en Authorization: “Basic USER_AUTH_KEY”.

 

De esta forma, apuntando a:

 

https://onesignal.com/api/v1/apps

 

obtendremos el ID de la app, el nombre, cuántos usuarios tiene, etc.

Además, veremos un campo llamado Basic_auth_key. Este nos interesa, porque nos permitirá llevar a cabo la Operación AñadirDispositivo

 

Una vez creada la app mediante la web, y vista gracias al POSTMAN, vamos a probar el AñadirDispositivo. Usamos los siguientes campos en las Headers:

 

 

Y en body, rellenamos el form-data (el app_id lo localizamos en la web, o en los campos devueltos antes en VerApp). Los únicos campos obligatorios son app_id y device_type, el cual indica mediante un número, si es un móvil, tablet...:

 

Apuntamos a la URL:

 

https://onesignal.com/api/v1/players

 

Y enviamos mediante POST, obteniendo una respuesta en la que se indica el ID del dispositivo recién creado y en success un true si se pudo crear correctamente.

 

Ahora vamos a hacerlo mediante Ensemble, crearnos una Operación desde la cual añadirDispositivo.

 

Class Operaciones.REST.NotificacionesPUSH.AñadirDispositivo Extends EnsLib.REST.Operation

{

Parameter INVOCATION = "Queue";

Method AñadirDispositivo(pRequest As Mensajes.Request.NotificacionesPUSH.AñadirDispositivo, pResponse As Mensajes.Response.NotificacionesPUSH.AñadirDispositivo) As %Library.Status

{

set httpRequest = ##class(%Net.HttpRequest).%New()

set tResponse = ##class(%Net.HttpResponse).%New()

 

//Incluimos en las Headers la Basic Auth Key comentada antes

set httpRequest.ContentType = "application/json"

set httpRequest.Authorization = "Basic "_##class(Util.TablasMaestras).getValorMaestra("NOTIFICACIONESPUSH","onesignal_apikey")

$$$LOGINFO("httpRequest.Authorization: "_httpRequest.Authorization)

 

//Vamos a crearnos un formulario con los nombres de los parámetros a enviar como las claves, y los valores los que tomamos del mensaje request

set tFormVarNames = "app_id,language,device_type,timezone"

 

set tData("app_id") = pRequest.idApp

set tData("language") = pRequest.idioma

set tData("device_type") = pRequest.tipoDispositivo

set tData("timezone") = pRequest.zonaHoraria

 

//Se envía a https (OneSignal redirige automáticamente aunque pongamos http)

set ..Adapter.SSLConfig = "nombre_certificado"

 

//set tSC = ..Adapter.SendFormDataArray(.tResponse,"POST",httpRequest,.tFormVarNames,.tData,"/api/v1/players")

set tSC = ..Adapter.SendFormDataArray(.tResponse,"POST",httpRequest,.tFormVarNames,.tData,"https://onesignal.com/api/v1/players")

//set tSC = ..Adapter.SendFormDataArray(.tResponse,"POST",httpRequest,.tFormVarNames,.tData,"http://onesignal.com/api/v1/players")

 

if $$$ISERR(tSC){

$$$ThrowOnError(tSC)

}

if (tResponse.Data.AtEnd = 0) {

$$$LOGINFO("En AñadirDispositivo, tamaño de tResponse: "_tResponse.Data.Size)

set linea = tResponse.Data.Read()

$$$LOGINFO("Linea: "_linea)

}

 

set pResponse = ##class(Mensajes.Response.NotificacionesPUSH.AñadirDispositivo).%New()

do pResponse.return.Write(linea)

 

 

Quit pResponse

}

XData MessageMap

{

<MapItems>

  <MapItem MessageType="Mensajes.Request.NotificacionesPUSH.AñadirDispositivo">

    <Method>AñadirDispositivo</Method>

  </MapItem>

</MapItems>

}

}

Después, vamos a la Producción, donde subiremos la Operación recién creada:

 

De esta forma, si pulsamos en ella, Actions -> Test podemos probarla:

 

Y si vamos a la traza veríamos el circuito completo:

 

 

En el caso del ejemplo, se ve en rojo puesto que le falta el certificado a la Operación.

Una vez configurado, nos debería salir un mensaje de respuesta:

 

 

A continuación, escribimos el servicio que usarán los agentes externos, como una app móvil, para comunicarse con nosotros.

 

Vamos a crearnos un servicio REST. Para ello hay que tener en cuenta tres hechos:

 

Necesitamos que extienda de Ens.BusinessService, su ADAPTER debe ser “EnsLib.HTTP.InboundAdapter” y debe implementar el método OnProcessInput()

 

Class Servicios.REST.NotificacionesPUSH.GestionMensajeriaPush Extends Ens.BusinessService

{

Parameter ADAPTER = "EnsLib.HTTP.InboundAdapter";

Parameter EnsServicePrefix = "/gestionMensajeriaPush";

Method OnProcessInput(pInput As %Stream.Object, Output pOutput As %Stream.Object) As %Status

{

Set tCmd=$ZConvert(pInput.Attributes("HttpRequest"),"U")

Set tURL=$ZConvert(pInput.Attributes("URL"),"I","URL")

$$$LOGINFO("URL en GestionMensajeriaPush:"_tURL)

 

Set tService="/"_$Piece(tURL,"/",5)

$$$LOGINFO("tService: "_tService)

Quit:..#EnsServicePrefix'=tService $$$ERROR($$$EnsErrGeneral,"Service "_tService_"/ not supported.")

 

Set tType=$Piece(tURL,"/",7)

$$$LOGINFO("tType "_tType)

Quit:$Case(tType,"anadirDispositivo":0, :1) $$$ERROR($$$EnsErrGeneral,"Directory type "_..#EnsServicePrefix_"/"_tType_"/ not supported.")

 

if (tType = "anadirDispositivo") {

do ..añadirDispositivo(pInput,.pOutput)

 

Quit $$$OK

}

Method añadirDispositivo(pInput As %Stream.Object, Output pOutput As %Stream.Object) As %Status

{

 

Set pOutput=##class(%GlobalBinaryStream).%New()

set claseAux = ##class(%ZEN.Auxiliary.jsonProvider).%New()

 

set req = $tr(pInput.GetAttribute("request"),"")

set tSC= claseAux.%ConvertJSONToObject(.req,"Mensajes.Request.NotificacionesPUSH.AñadirDispositivo",.objetoEntrada,1)

$$$LOGINFO("Añadir dispositivo: "_req)

 

 

set tSC = ..SendRequestSync("GestionMensajeriaPush",objetoEntrada,.objetoSalida)

 

set tSC = claseAux.%WriteJSONStreamFromObject(.pOutput,.objetoSalida,,,,"aeloqtuw")

 

Do:$$$ISOK(tSC) pOutput.SetAttribute("Content-Type","application/json")

do pOutput.SetAttribute("Access-Control-Allow-Origin","*")

do pOutput.SetAttribute("Access-Control-Allow-Credentials","true")

do pOutput.SetAttribute("Access-Control-Allow-Methods","GET")

    do pOutput.SetAttribute("Access-Control-Allow-Headers","request,Access-Control-Allow-Headers, Origin,Accept, X-Requested-With, Content-Type, Access-Control-Request-Method, Access-Control-Request-Headers")

Quit tSC

}

 

En concreto lo que estamos expresando es que queremos publicar un servicio, el cual tendrá el formato: http://url/x/x/x/gestionMensajeriaPush/x/anadirDispositivo 

 

Además, le estamos diciendo que queremos que envíe la petición al Proceso: GestionMensajeriaPush. Éste lo crearemos a continuación.

 

Es un proceso cuya misión será conectar el servicio, con la operación de añadirDispositivo.

 

Además, vamos a subir a la producción, el servicio y el proceso recién creados, quedando el circuito completo:

 

 

Y ahora sí podemos probarlo desde el POSTMAN. Para ello, creamos la URL que hayamos indicado para el servicio, junto a la IP y puerto apropiados:

 

 

De esta forma veremos:

 

 

Dándonos como respuesta el ID del dispositivo creado y si fue creado.

 

¡Espero que os resulte útil!