Cabe mencionar que los ejemplos mostrados a continuación quieren mostrar la creación y el consumo de servicios Web, nada complejo en seguridad ni adicionales como Login en los servicios o manejo sobre protocolo https o cualquier otra cosa por el estilo.
Para está entrada se creará dos tipos de servicios (SOAP y RESTful) desde el IDE de Genexus en Ambiente Web para C# (C sharp). Adicionalmente se creará sus respectivos Clientes que consuman dichos servicios tanto desde Genexus como desde un Cliente Nativo Android.
Servidor
Para ambos servicios se usará el objeto "Procedure" de Genexus más ciertas configuraciones adicionales para establecer el servicio necesitado. Se tiene una "Transacción" Application con tres campos Id (Numeric), Name (VarChar), ClientId (VarChar) (Figura 1.), ClientSecret (VarChar). Se ha creado un objeto "SDT" basado en estos tres campos (Figura 2).
Fig 1. Transsacción
Fig 2. SDT
Servicio Web Tipo SOAP
Como ya se mencionó para habilitar los servicios Web se usa el objeto "Procedure". Así que crearemos un objeto de dicho tipo del nombre "getApplications" para el servicio SOAP.
En el código correspondiente al objeto tendremos una consulta mediante "For each" a la Tx Creada. Observesé la condición "where ApplicationId = &ApplicationId" que nos permitirá filtrar la información a obtener de la Tx y a ser almacenada en la variable SDT correspondiente.
for each
where ApplicationId = &ApplicationId
&sdtApplication = new()
&sdtApplication.ApplicationName = ApplicationName
&sdtApplication.ApplicationClientId = ApplicationClientId
&sdtApplication.ApplicationClientSecret = ApplicationClientSecret
endfor
Posteriormente, en la sección de parámetros tenemos como entrada la variable "ApplicationId" y como salida la variable "sdtApplication".
parm(in: &ApplicationId, out:&sdtApplication);
En las propiedades del objeto configuramos las opciones:
- Call Protocol: SOAP
- Main Program: True
http://[localhost o ip local]/[Nombre de la la KB].[Ambiente Web de la KB]/a[nombre del procedure].aspx
Fig 3. URL de Servicio SOAP
Para unas pruebas más exhaustivas se puede instalar "SOA Client" en mi caso el add-On para el Navegador Firefox (Descarga Aquí) y añadiendo en la ruta anterior el parámetro ?wsdl usar directamente el servicio Web como se puede observar en la figura 4.
Servicio Web Tipo RESTful
De manera similar podemos usar un objeto "Procedure" para un servicio tipo RESTful, Para mantener el código y parámetros anteriores podemos hacer un Save As del objeto anterior (Poniendo por default las configuraciones cambiadas anteriormente) o usar un nuevo "Procedure" con el mismo código y parámetros. El nombre del procedure será "getApplicationsRest".
Pero en el cual configuramos las siguientes opciones de las propiedades:
- Expose as a web Service: True
- Rest Protocol: True
http://[localhost o ip local]/[Nombre de la la KB].[Ambiente Web de la KB]/rest/[nombre del Procedure]
De manera similar para otro tipo de pruebas se puede instalar el Add-On "Rest Client" sobre el Navegador Firefox (Descarga Aquí) ver la figura 5.
Fig 5. Consumo de REST mediante Rest Client
Cliente
Cliente Web Genexus para servicio SOAP
Bueno si recuerdan la Url del servicio SOAP, aquella compuesta por la terminación wsdl, pues esta misma url es vital para construir el Cliente para el consumo del servicio. Esta url si la abrimos en el navegador como muestra la figura 6, nos muestra en formato xml principalmente:
- El NameSpace en el que se ejecuta el Servicio, en este caso el nombre de la KB.
- El nombre del método o Acción a llamar.
- Los parámetros de entrada y el tipo de dato.
- Los parámetros de salida y su tipo de dato.
Fig 6. WSDL del servicio SOAP construido en Genexus.
Toda esta información es usada por Genexus en un Wizard para construir un "External Object" y un "SDT", que consuma el servicio y lo almacene respectivamente.
Podemos usar una nueva KB, o la misma si se desea, y nos ubicamos en la opción del menú Tools / Application Integration / WSDL Import
Fig 7. Acceso al WSDL Import.
Obtendremos la pantalla correspondiente donde ingresaremos la url respectiva. Ver figura 7.
Fig 8. WSDL Import.
Una vez realizado el import del WSDL, podemos observar que se ha creado un External Object para la llamada al servicio SOAP y un SDT para su almacenamiento.
Fig 9. External Object creado por WSDL Import.
Fig 10. SDT creado por WSDL Import.
Para consumir los mismos podemos hacer una llamada desde una pantalla Web mediante el uso de una variable basada en el External Object creado por el wizard y almacenándolo en el SDT respectivo:
&getAppsdtApplication = &getApplications.Execute(&ApplicationId)
Cliente Web Genexus para servicio RESTful
Bueno para consumir un servicio Rest en Genexus es un poco más complicado ya que no existe ningún wizard como en el caso de Soap, pero se puede usar un tipo de objeto llamado HttpClient para realizar la llamada al mismo y capturar la respuesta del servidor.
Adicionalmente en el HttpClient, se debe configurar:
- El Servidor al cual se va a acceder.
- La Url base del Servicio Rest.
- El puerto usado para la conexión.
- El cuerpo o body, es decir los parámetros de entrada en formato JSON.
- La cabecera como tipo 'Content-type' y 'application/json'.
- El nombre del servicio (en este caso el nombre del procedure) y el Método Http a usar (en base a la documentación de la Wiki de Genexus se debe usar siempre el método POST).
Todas estas configuraciones son visibles en el siguiente código:
&httpclient.Host = "localhost" //Servidor
&httpclient.Port = 80 //Puerto
&httpclient.BaseUrl = "/IAMEV3.NetEnvironment/rest/" //Url Base
&httpclient.AddHeader('Content-type','application/json') //Cabecera
&httpclient.AddString('{"ApplicationId":1}') // body o parámetros de entrada en formato JSON
Para ejecutar el cliente http se usa el método Execute especificando el método Http y el nombre del procedure.
&httpclient.Execute('POST','getapplicationsrest')
Para la captura de la respuesta simplemente se puede hacer un String del HttpClient.
&httpclient.ToString()
Y para la visualización de Errores se puede usar los métodos ErrCode y ErrDescription del HttpClient.
&httpclient.ErrCode
&httpclient.ErrDescription
EXCELENTE
ResponderEliminarHola, de ante mano gracias por el material, muy bueno.
ResponderEliminarTengo una duda, si a mi procedimiento REST le paso parametros in, me da un error 500, algo de mapeo de objetos, tienes idea de que pueda ser. Quiero publicar un servicio web para consumirlo desde una app movil que no esta hecha con genexus. Gracias
Hola buen día
ResponderEliminarUna consulta para Servicio Web Tipo RESTful, que otras propiedades hay que setear para el procedimiento?
Digo por ejemplo en el caso de la propiedad "Main program" y "Call protocol" que valores deben tener??
Gracias
https://wiki.genexus.com/commwiki/servlet/wiki?21467,Procedures+as+Rest+web+services+in+GeneXus,
EliminarBuen día José
EliminarMuchas gracias
Tener en cuenta que si están intentando consumir el servicio rest ya publicado con Genexus los parametros deben ser "?fmt=json" y en el application/json armar el json con las variables o parámetros de entrada definidos en el PRC.
EliminarHola, yo tengo la version 9 de Genexus. Para la configuracion de REST no tengo esa opcion. Supongo que la version que tengo no es soportardo
ResponderEliminar¿cierto?
Que otro ajuste debeo realizar, segui tu instructivo paso a paso y genero el procedimiento soap, lo guardo con otro nombre como indicas y cambio las propiedades que indicas para hacerlo REST pero me surge la duda la propiedad call protocol debe seguir siendo SOAP o debo cambiarlo a HTTP? si hago ese cambio me genera un error Error de lectura XML: no se encuentra el elemento raíz
ResponderEliminarUbicación: http://localhost/PRUEBAREST.NetEnvironment/agetapplicationsrest.aspx
Número de línea 1, columna 1: pero si lo dejo con call protocol SOAP al ejecutar genera esto
Q tal las configuraciones del procedure son las q se crean por defecto, y solo modificar las q se mencionan en el paso a paso.
EliminarHola, tal vez sabes como cambiar el http response code en un api rest. Hice uno en genexus pero la respuesta siempre es 200, deseo que cuando haya algun error la respuesta sea 400.
ResponderEliminarHola, hace un buen tiempo que ya no he trabajado con Genexus, estaba revisando la wiki pero no puede encontrarme con nada especifico. Veo que ha evolucionado mucho con las nuevas versiones de Genexus el consumo de APIs y REST.
EliminarUna opcion que se me ocurre es manejar el protocolo de consumo del REST, es decir el HTTP, especificamente como se haria en la programacion mas clasica, donde tienes un HttpRequest q procesas, un HttpHeader y un HttpResponse q es lo que devuelves al cliente. Y por medio de este setear tu error segun la logica que desees manejar del REST por un HttpErrorCode(para el caso del procedure). Buscando en la wiki de Genexus me parece que si hay documentacion de este tipo de objetos en Genexus. Otra opcion seria hacerlo con codigo nativo dependiendo de tu generador (Para ello podrias verificar el codigo fuente generado para saber q objetos o variables usar).
Espero te sea de ayuda.
Ola tenho GX16 e comecei a usar Rest com Java. Identifiquei que é necessario ajustar o tomcat web.xml, adicionando um regra de permissao para seu app ou outro sistema ter acesso.
ResponderEliminar