1 de mayo de 2003

Consumiendo Servicios Web con Microsoft Visual FoxPro

José G. Samper C.
VFP 7.0 y VFP 8.0

Con el surgimiento de SOAP y los Servicios Web se abre un mundo de posibilidades para la interconexión de plataformas y aplicaciones. Decimos que nos abre un mundo de posibilidades por que los Servicios Web nos permite el acceso a diversas funciones vía Web y de esta manera le damos funcionabilidad adicional y un valor agregado a nuestras aplicaciones.

Obteniendo información de WSDL

Como SOAP define un estándar WSDL, todo Servicio Web tiene una página XML con la descripción de los objetos, la sintaxis y métodos disponibles. Estas páginas nos sirven como referencia para la elaboración de la sintaxis de llamada y nos permite verificar si hubo cambios en el Servicio Web. No es necesario entender el documento para consumir un Servicio Web.

Ejemplo:

Para este artículo usaremos el Servicio Web de http://www.universalthread.com, cuando consultamos el WSDL de este Servicio obtenemos:


Invocando el Servicio Web desde nuestra aplicación Cliente

Para este artículo elaboraremos una pequeña aplicación que nos permita ver la Lista de Artículos disponibles y la Lista de Archivos disponibles para Downloads en Universal Thread. Dos de los 31 métodos disponibles de este Servicio Web.

1. Creamos nuestro proyecto


2. Creamos un formulario que contenga un Pageframe con dos Page, un Grid y un Commandbutton en cada Page.


3. En el INIT de nuestra forma escribimos nuestro código de invocación del Servicio Web.
Public lo_serv As Object
Local lc_user As String,lc_pasword As String
lo_serv=Createobject("mssoap.soapclient30") && Creamos Objeto Soap
lo_serv.mssoapinit("http://www.universalthread.com/WebService/universalthread.wsdl") 
**Solicitud del usuario y password requerido por el servicio Web
lc_user=''
lc_user = Inputbox("Usuario","Usuario de universalthread ")
lc_pasword=''
lc_pasword = Inputbox("Password","Password para "+lc_user)
If Empty(lc_user) Or Empty(lc_pasword)
 =Messagebox('Debe introducir Usuario y Password para acceder al sistema',16)
 Return .F.
Endif
** Autentificamos en www.universalthread.com
If !lo_serv.Login(lc_user,lc_pasword)
 =Messagebox('No se pudo autentificar su usuario en universalthread.com.',16)
 Return .F.
Endif
Thisform.pageframe1.page1.grid1.Visible=.F.
Thisform.pageframe1.page1.grid2.Visible=.F.

Observe que:

a. Creamos un objeto SOAP e inicializamos nuestro Servicio Web
b. Solicitamos el usuario y password requerido y luego autentificamos nuestro usuario en Universal Thread.

4. En el método Click de Commandbutton del Page1, escribimos nuestro código de llamada al método del Servicio Web que nos envía la Lista de Artículos disponibles en formato XML.
Local lc_xml As String
lc_xml=''
**Invocamos el método del web service que no devuelve la 
**lista de artículos de los ultimos 45 ías
lc_xml=lo_serv.GetArticle(Date()-45,Date(),5)
**Mostramos el XLM devuelto
=Messagebox(lc_xml,64)
If !Empty(lc_xml)
    ** Convertimos el XML devuelto en un cursor temporal
 Xmltocursor(lc_xml,'Carticulo')
 ** Seleccionamos nuestro cursor y lo mostramos en el Grid
 Select Carticulo
 Goto Top In Carticulo
 If !Eof('Carticulo')
  Thisform.pageframe1.page1.grid1.RecordSource='Carticulo'
  Thisform.pageframe1.page1.grid1.Visible= .T.
  Thisform.pageframe1.page1.grid1.Refresh()
 Endif
Endif

Observe que:
a. Invocamos al Servicio Web, solicitando la Lista de los Artículos.
b. Mostramos el XML devuelto por el Servicio Web, usted puede eliminar este código, dicho código fue colocado como demostración del XML devuelto.
c. Convertimos el XML en un Cursor temporal y lo mostramos en el Grid.

5. En el método Click de Commandbutton del Page2, escribimos nuestro código de llamada al método del Servicio Web que nos envía la Lista de Archivos disponibles para Downloads en formato XML.
Local lc_xml As String
lc_xml=''
**Invocamos el método del web service que no devuelve la 
**Lista de Archivos disponibles para Downloads de los últimos 20 días
lc_xml=lo_serv.GetDownload(DATE()-20,DATE(),5)      
**Mostramos el XLM devuelto
=Messagebox(lc_xml,64)
If !Empty(lc_xml)
    ** Convertimos el XML devuelto en un cursor temporal
 Xmltocursor(lc_xml,'CDownload')
 ** Seleccionamos nuestro cursor y lo mostramos en el Grid
 Select CDownload
 Goto Top In CDownload
 If !Eof('CDownload')
  Thisform.pageframe1.page2.grid1.RecordSource='CDownload'
  Thisform.pageframe1.page2.grid1.Visible= .T.
  Thisform.pageframe1.page2.grid1.Refresh()
 Endif
Endif

Observe que:
a. Invocamos al Servicio Web, solicitando la Lista de los Artículos.
b. Mostramos el XML devuelto por el Servicio Web, usted puede eliminar este código, dicho código fue colocado como demostración del XML devuelto.
c. Convertimos el XML en un Cursor temporal y lo mostramos en el Grid.

Ejecutando nuestra Aplicación

Al ejecutar nuestro formulario y autentificar con Universal Thread, ya podemos acceder a los métodos de programados en nuestro formulario. Al pulsar clic en cualquiera de los dos commandbutton obtendremos:

a. XML de la información solicitada al Servicio Web.


b. Con la función Xmltocursor() obtenemos un cursor con los datos del XML enviado por el Servicio Web.


Conclusiones:

Los servicios Web son una excelente opción para la integración de aplicaciones y agregarle funcionabilidad adicional a nuestras aplicaciones.


José G. Samper C., Caracas, Venezuela, es Analista Programador,Microsoft Most Valuable Profesional en Visual Fox Pro. Dedicado al desarrollo de sistemas desde el año 1991; siempre en Fox o en Visual Fox Pro. Actualmente especializándose en C# y Jefe de Proyectos Especiales en Softech Consultores, C.A.

1 comentario :