Traducido por: Roberto Alfredo Moré
Rehacer vuestras aplicaciones para
correr sobre la Web es una manera de aprovechar las ventajas de Internet,
pero es también un intenso emprendimiento que requiere repensar completamente la
manera en que trabajan esas aplicaciones. En muchas situaciones se puede
aprovechar la funcionalidad de Internet a mucho más bajo nivel simplemente
integrando la funcionalidad específica en vuestras aplicaciones. Este documento
describe varias maneras que te permitirán construir funcionalidad Internet sobre
aplicaciones existentes con relativamente poco esfuerzo dándote grandes mejoras
en la facilidad de uso con muy poco código.
En este artículo averiguarás
como:
¨
Acceder a Internet y Windows monikers usando ShellExecute API
¨
Integrar correo electrónico SMTP, FTP y HTTP básico.
¨
Acceder a archivos de bases de datos sobre un servidor en Internet
¨
Acceder a SQL Server a través de Internet usando TCP/IP
¨
Usar DCOM sobre Internet y TCP/IP
¨
Usar
Microsoft RDS para acceder a datos y objetos COM sobre un servidor Web
Para averiguar más sobre cómo
construir aplicaciones distribuidas sobre HTTP ver el artículo siguiente: Building distributed
applications over HTTP with wwIPStuff
(Construyendo aplicaciones
distribuidas sobre HTTP con wwIPStuff)
¡Un cliente "gordo" no es del todo malo!
Los clientes "gordos"
vienen teniendo una mala fama como una tecnología obsoleta que no puede ser
escalada. Mientras que esto puede ser cierto, es también un hecho que la vasta
mayoría de las aplicaciones continúa siendo independientes o son aplicaciones
de red que corren en máquinas cliente. Las aplicaciones comerciales a menudo
necesitan la flexibilidad que no pueden tener sin un entorno de un cliente rico
y la funcionalidad de base de datos que usa funcionalidad local para proveer
este entorno.
Un
cliente "delgado" está de moda, pero cada vez más es
un propulsor hacia la construcción de aplicaciones que comparten la lógica
y el acceso de datos entre el cliente y capas de servidor . Yo llamo a esto
aplicaciones cliente medianas, que usan las herramientas de desarrollo
tradicionales para implementar aplicaciones distribuidas que comparten la
responsabilidad de la lógica entre el cliente y el servidor utilizando Internet
como una red.
En este contexto, este artículo
discute maneras para que puedas aprovechar las tecnologías de Internet sin
abandonar la flexibilidad y la funcionalidad a la que estás acostumbrado con
Visual FoxPro.
Mejorando las aplicaciones existentes.
El primer y más sencillo paso para
la integración con Internet es la mejora de las aplicaciones existentes
agregando funcionalidades básicas de Internet:
¨
Incorporando características menores
Pequeñas mejoras de protocolos básicos de Internet pueden producir grandes mejoras en la funcionalidad de aplicaciones existentes.
Pequeñas mejoras de protocolos básicos de Internet pueden producir grandes mejoras en la funcionalidad de aplicaciones existentes.
¨
Enlaces a la Web links, correo electrónico, FTP, acceso HTTP
Las aplicaciones pueden aprovechar fácilmente características como Hyperlinks y Extensiones de Interfase Windows que son realmente muy fáciles de implementar vía la Windows Shell API. El correo electrónico continúa siendo una parte importante del uso de Internet para la mayoría de los usuarios y agregar el correo electrónico puede proveernos de un importante mecanismo de feedback para informes de estado, notificaciones, manejo de errores y muchas más posibilidades. El mover archivos entre diferentes ubicaciones es otra característica que muchas aplicaciones requieren. Usando servidores de FTP o HTTP para contener estos archivos y dándole a la gente acceso distribuido puedes hacer que tus aplicaciones sean mucho más flexibles y que puedan compartir información con usuarios en cualquier lugar. El acceso HTTP es también muy poderoso para recuperar e interactuar con contenido Web existente. Lo hermoso es que toda esta funcionalidad puede ser agregada más o menos fácilmente y con muy poco código.
Las aplicaciones pueden aprovechar fácilmente características como Hyperlinks y Extensiones de Interfase Windows que son realmente muy fáciles de implementar vía la Windows Shell API. El correo electrónico continúa siendo una parte importante del uso de Internet para la mayoría de los usuarios y agregar el correo electrónico puede proveernos de un importante mecanismo de feedback para informes de estado, notificaciones, manejo de errores y muchas más posibilidades. El mover archivos entre diferentes ubicaciones es otra característica que muchas aplicaciones requieren. Usando servidores de FTP o HTTP para contener estos archivos y dándole a la gente acceso distribuido puedes hacer que tus aplicaciones sean mucho más flexibles y que puedan compartir información con usuarios en cualquier lugar. El acceso HTTP es también muy poderoso para recuperar e interactuar con contenido Web existente. Lo hermoso es que toda esta funcionalidad puede ser agregada más o menos fácilmente y con muy poco código.
¨
Control del Explorador Web
El control del Explorador Web IE inaugura toda una nueva manera de pensar acerca de una interfase de usuario para las aplicaciones. Primero, el control te permite agregar un explorador personalizado dentro de tu aplicación, uno que puede ser fácilmente conducido por tu aplicación y completamente controlado por ella permitiéndote controlar estrictamente el contenido al que accede el explorador personalizado. Pero también puede servir como un gran mecanismo para mostrar un rico contenido en una aplicación y es aun una manera de facilitar el desarrollo de aplicaciones centradas en la Web que pueden tener que convivir como una aplicación independiente en un ordenador (o en un CD) y como una aplicación Web accedida puramente a través de un explorador y un servidor Web.
El control del Explorador Web IE inaugura toda una nueva manera de pensar acerca de una interfase de usuario para las aplicaciones. Primero, el control te permite agregar un explorador personalizado dentro de tu aplicación, uno que puede ser fácilmente conducido por tu aplicación y completamente controlado por ella permitiéndote controlar estrictamente el contenido al que accede el explorador personalizado. Pero también puede servir como un gran mecanismo para mostrar un rico contenido en una aplicación y es aun una manera de facilitar el desarrollo de aplicaciones centradas en la Web que pueden tener que convivir como una aplicación independiente en un ordenador (o en un CD) y como una aplicación Web accedida puramente a través de un explorador y un servidor Web.
Usando Internet como una red
Internet ha convertido la idea de
una red global en una realidad que tu aplicación puede aprovechar. No obstante,
con toda la promoción sobre aplicaciones distribuidas y aplicaciones centradas
en servidores Web, no ha habido mucha discusión acerca del acceso de datos a
través de Internet y de la lógica conductora de las aplicaciones servidoras
desde el cliente.
¨
Accediendo a contenido Web
Uno de los más poderosos conceptos de Internet es la capacidad de tener aplicaciones cliente que accedan a contenido Web. Utilizando una aplicación cliente rica que se pueda comunicar con servidores a través de Internet ya sea para capturar contenido simple o para ejecutar aplicaciones, logras un nuevo nivel de posibilidades para tu aplicación. Es realmente muy fácil recoger contenido de Internet y usarlo como fuente de información en tus aplicaciones.
Uno de los más poderosos conceptos de Internet es la capacidad de tener aplicaciones cliente que accedan a contenido Web. Utilizando una aplicación cliente rica que se pueda comunicar con servidores a través de Internet ya sea para capturar contenido simple o para ejecutar aplicaciones, logras un nuevo nivel de posibilidades para tu aplicación. Es realmente muy fácil recoger contenido de Internet y usarlo como fuente de información en tus aplicaciones.
¨
Accediendo a datosSobre la
misma línea, es posible acceder a datos sobre Internet. TCP/IP es un protocolo
estándar de red soportado por Windows y es posible acceder a datos en Internet
como con cualquier otra conexión de red. También hay maneras de usar
herramientas intermedias y componentes que le pueden dar a tu aplicación cliente
la capacidad de acceder a datos del servidor. Mostraré algunos ejemplos de esto
usando código FoxPro puro, tanto sobre el servidor como en el cliente, así como
del Servicio de Acceso a Datos de Microsoft (RDS) que provee una funcionalidad
muy similar en un componente de sistema.
¨
Construyendo aplicaciones distribuidas con VFP sobre el cliente y
el servidor
La Web está motorizada por HTTP. HTTP es un protocolo relativamente simple para trabajar con él. Con él, es fácil crear aplicaciones complejas que puedan ser controladas y/o compartidas tanto por el cliente como por el servidor. En este escenario, las aplicaciones tienen la capacidad de trabajar fuera de línea o de usar la Web como una alimentación viva de datos/contenido. Esto puede relacionarse ya sea con tu aplicación corriendo sobre un servidor Web o con cualquier recurso disponible en Internet. Por ejemplo, es muy fácil "bajar" todo tipo de información como cotización de acciones, pronósticos meteorológicos, noticias, etc., la que puedes usar para personalizar y mejorar tu aplicación. Finalmente, puedes construir una aplicación verdaderamente distribuida con VFP, donde la aplicación del lado cliente controla parte de la lógica y el servidor el resto. La potencia de este mecanismo es que puedes mezclar y ensamblar tecnologías de cliente y servidor, o incluso puedes usar clientes VFP "conversando" con servidores VFP a través de Internet.
La Web está motorizada por HTTP. HTTP es un protocolo relativamente simple para trabajar con él. Con él, es fácil crear aplicaciones complejas que puedan ser controladas y/o compartidas tanto por el cliente como por el servidor. En este escenario, las aplicaciones tienen la capacidad de trabajar fuera de línea o de usar la Web como una alimentación viva de datos/contenido. Esto puede relacionarse ya sea con tu aplicación corriendo sobre un servidor Web o con cualquier recurso disponible en Internet. Por ejemplo, es muy fácil "bajar" todo tipo de información como cotización de acciones, pronósticos meteorológicos, noticias, etc., la que puedes usar para personalizar y mejorar tu aplicación. Finalmente, puedes construir una aplicación verdaderamente distribuida con VFP, donde la aplicación del lado cliente controla parte de la lógica y el servidor el resto. La potencia de este mecanismo es que puedes mezclar y ensamblar tecnologías de cliente y servidor, o incluso puedes usar clientes VFP "conversando" con servidores VFP a través de Internet.
Mejorando aplicaciones existentes.
Comencemos mirando la mejora de las
aplicaciones existentes. Cubriré los siguientes temas:
¨
Shell API
¨
Correo electrónico SMTP
¨
FTP
¨
Programación básica para acceso Web
La Shell API
Una de las más sencillas y
poderosas características del sistema operativo Windows es la Shell API. Esta
API no es específica de Internet pero provee atractivas funcionalidades
para el uso de Internet. Provee un mecanismo para "ejecutar"
cualquier clase de documento que Windows conozca. Usando esta API puedes
"ejecutar" un documento Word o un archivo .EXE, acceder a
una URL en tu navegador por defecto, forzar a que aparezca una ventana de
correo electrónico o abrir tu editor HTML favorito para editar un documento
HTML. La interfase trabaja a través de un mecanismo denominado monikers,
que es esencialmente la manera en que Windows interpreta las líneas de
comando. Si Windows puede reconocer un moniker, intentará ejecutarlo
de la misma manera que lo hace cuando haces doble click sobre un
documento con una extensión conocida en el Explorador Windows.
La Shell API está implementada
de varias maneras diferentes, la más simple de ellas es una llamada API que
puedes usar en tus aplicaciones Visual FoxPro. Para probarla, crea la siguiente
función:
FUNCTION ShellExec
LPARAMETER lcLink, lcAction, lcParms
lcAction = IIF(EMPTY(lcAction),
"Open", lcAction)
lcParms = IIF(EMPTY(lcParms),
"", lcParms)
DECLARE INTEGER ShellExecute ;
IN SHELL32.dll ;
INTEGER nWinHandle, ;
STRING cOperation, ;
STRING cFileName, ;
STRING cParameters, ;
STRING cDirectory, ;
INTEGER nShowWindow
DECLARE INTEGER FindWindow ;
IN WIN32API ;
STRING cNull,STRING cWinName
RETURN ShellExecute(FindWindow(0,
_SCREEN.caption), ;
lcAction, lcLink, ;
lcParms, SYS(2023), 1)
y prueba los siguientes enlaces
(ajusta el paso como sea necesario):
ShellExec("http://www.west-wind.com/")
ShellExec(ftp://ftp.west-wind.com/)
Encontrarás que en ambos casos
ShellExecute API ejecuta el navegador actualmente seleccionado por defecto (Sí,
puede ser Netscape) e intenta cargar la página especificada desde la Web.
También puedes forzar que se ejecute tu cliente de correo electrónico:
ShellExec("mailto:billg@microsoft.com")
con el nombre de Billy ya
escrito en el campo del destinatario y la ventana de mensaje lista para que
comiences a escribir la última razón por la que odias a Windows. Aunque
la Shell API puede ser usada para acceder a cualquier enlace que podrías
usar como enlace HREF en un documento HTML, también puedes acceder a otras cosas
de tu sistema:
*** Abrir el Explorador en c: emp
Shellexec("c: emp")
*** Ejecutar VFP
ShellExec("c:vstudiovfp98vfp6.exe")
*** Abrir un documento Word
ShellExec("c:WebbookChapter7Chapter7.doc")
*** Abrir un archivo Zip con WinZip
ShellExec("c:downloadssouthpark.zip")
También puedes editar e imprimir
un documento, si el tipo de documento lo soporta:
*** Aparece el editor HTML configurado en el
sistema
ShellExec("http://www.west-wind.com/",
"Edit")
ShellExec("c:WebbookChapter7Chapter7.doc",
"Print")
La primera de las instrucciones
provoca que el código HTML del sitio West Wind se abra en tu editor HTML
favorito (si tienes uno configurado), listo para la edición. El último ejecuta
Microsoft Word e imprime el documento solicitado.
Como tiene la capacidad de
ejecutar tu explorador Web, esta API es un fácil método para atraer gente a tu
sitio Web con un botón o una opción de menú. Puedes fácilmente agregar esta
funcionalidad para llevar a los usuarios a páginas de información, actualizar
páginas y, naturalmente, páginas con formularios de pedido para comprarte más
cosas. Puedes incluso mostrar información personalizada, o información que se
actualiza en forma periódica, simplemente usando convenciones de nombre para
las páginas HTML en el servidor (¿qué tal un consejo del día con páginas HTML
con nombres como Tip102098.htm?). También puedes provocar que el pedido sea
dinámico a través de la cadena URL consultando un enlace dinámico al servidor
como una página ASP o una solicitud FoxISAPI:
Esto te lleva directamente al
mensaje especificado en esta aplicación de tablón de mensajes. Podrías
mostrar información de consulta en el servidor de la misma
manera.
Adicionalmente, la API hace
fácil mostrar HTML en tus aplicaciones, ya sea desde un archivo o una
cadena de texto. He aquí una útil y pequeña función que usa ShellExecute para
mostrar un texto HTML en el explorador:
FUNCTION ShowHTML
LPARAMETERS lcHTML, lcFile, loWebBrowser
lcHTML = IIF(EMPTY(lcHTML), "",
lcHTML)
lcFile = IIF(EMPTY(lcFile), SYS(2023) +
"\_HTMLView.htm",lcFile)
STRTOFILE(lcHTML, lcFile)
IF VARTYPE(loWebBrowser) = "O"
*** Si se pasó un objeto browser usarlo
*** en lugar de una ventana externa del browser
*** Si se pasó un objeto browser usarlo
*** en lugar de una ventana externa del browser
loWebBrowser.Navigate(lcFile)
ELSE
ShellExecute(lcFile)
ENDIF
RETURN
Puedes simplemente pasar
cualquier cadena HTML a esta función y la interpretará en el explorador que
emergerá abierto. Si tienes una instancia existente de un objeto WebBrowser o
de un objeto IE COM (más sobre esto más adelante), puedes interpretar el HTML
dentro de ese objeto en lugar de una ventana externa controlada por
ShellExecute.
También puedes llamar a la
interfase COM de la Shell API para acceder a toda clase de interesantes
funcionalidades de Windows:
o =
CREATEOBJECT("Shell.Application")
o.Open("http://www.west-wind.com/")
*** Dispara en forma modal los diálogos
Windows
o.SetTime()
o.FindFiles()
o.ShutDownWindows()
o.FileRun()
o.ControlPanelItem("Network")
o.FileRun()
o.ControlPanelItem("Network")
"Open" trabaja
prácticamente igual que un llamado a la ShellExecute API, sólo que siempre usa
el verbo de acción Open. No hay una opción Edit o Print,
de manera que tienes que usar ShellExecute para esas operaciones. No obstante,
la Shell API también incluye el acceso a la mayoría de las operaciones del
escritorio Windows—pero ten presente que todas estas operaciones requieren
algún tipo de intervención del usuario. Estos métodos muestra diálogos en los
cuales el usuario debe llenar información o pinchar sobre un botón para
continuar. ¿Qué tiene todo esto que ver con Internet?. No mucho—pero puedes
encontrar útiles estas operaciones relacionadas.
Los protocolos Internet de wwIPStuff
wwIPStuff es una biblioteca de
clases que provee los protocolos comunes de Internet, agrupados en una única, y
fácil de usar, biblioteca de clases. La biblioteca de clases puede ser bajada
de http://www.west-wind.com/files/wwipstuff.zip
y está disponible como un shareware completamente funcional de West Wind
Technologies. La biblioteca fue construida originalmente para dar la
funcionalidad que sería comúnmente requerida en el curso del desarrollo de una
aplicación Web. Incluye soporte para correo electrónico SMTP,
funcionalidad FTP, búsqueda de nombre de dominio y búsqueda inversa, la capacidad
de discar una conexión RAS y un número de otras características relacionadas
con el manejo de conexiones HTTP a través de código. Las características HTTP
se describen en forma detallada más adelante en este artículo.
Envío de Correo Electrónico SMTP
El correo electrónico continúa
siendo la actividad más popular en Internet, y cada vez más aplicaciones
Internet están aprovechando la interfase de correo electrónico. De algunos de
los usos comunes del correo electrónico frecuentemente lo utilizo para:
¨
Enviar contenido de cualquier clase a un usuario
¨
Enviar confirmaciones e información de estado de cosas como solicitudes
de pedido colocadas, despachos, etc.
¨
Notificar errores en aplicaciones
¨
Enviar la salida de informes de mucho tiempo de ejecución a los usuarios
una vez que los informes están completos.
wwIPStuff implementa el correo
electrónico SMTP de salida vía una interfase DLL en wwIPStuff.dll, que
contiene una clase C++ de correo electrónico que realiza las operaciones de
conexión y comunicación con el servidor de correo. El código VFP simplemente
actúa como un intermediario para la función, con una gran interfase de
parámetros y propiedades de clase que pasan la información a la DLL para ser
procesados.
Para instalarla, simplemente
asegúrate de tener wwIPStuff.vcx/.vct, wwUtils.prg, wconnect.h y
wwIPStuff.dll en el camino de la aplicación actual o en algún lugar en el
Visual FoxPro SET PATH. El uso de la clase misma es muy simple. Sólo tienes que
definir unas pocas propiedades relevantes en el objeto wwIPStuff para enviar un
mensaje.
SET CLASSLIB TO wwIPSTUFF ADDITIVE
SET PROCEDURE TO wwUtils ADDITIVE
loIP =
CREATEOBJECT("wwIPStuff")
loIP.cMailServer =
"your.mailserver.com" && or IP address
loIP.cSenderEmail =
"yourname@yours.com"
loIP.cSenderName = "Jimmy Roe "
loIP.cRecipient = "jroe@roe.com
"
loIP.cCCList =
"jbox@com.com,ttemp@temp.com"
loIP.cBCCList =
"somebody@nowhere.com"
loIP.cSubject = "wwIPStuff Test
Message"
loIP.cMessage = "Test Message
body" + CHR(13)
*loIP.cAttachment =
"c: emppkzip.exe"
*** Espera de la finalización del envío.
llResult = loIP.SendMail()
IF !llResult
WAIT WINDOW loIP.cErrorMsg
ELSE
WAIT WINDOW NOWAIT "Message
sent..."
ENDIF
wwIPStuff es un cliente SMTP
minimalista que te permite usar la interfase de clase para definir las
propiedades del correo electrónico y del método SendMail() que realmente
envía el mensaje al servidor de correo. Puedes especificar el nombre del
remitente (nota que potencialmente puedes simular una dirección de correo
electrónico—esa es la manera en que SMTP trabaja) y luego definir la lista de
destinatarios. Puedes proveer ya sea una única dirección de correo electrónico
o una lista. En este último caso, separa cada destinatario primario,
destinatario CC y destinatario CC Invisible con comas. El mensaje de correo
electrónico real consiste en una línea de Asunto y un cuerpo de mensaje, que
puede tener cualquier longitud. Opcionalmente, puedes adjuntar un archivo al
mensaje; los archivos se codifican en formato MIME.
Los mensajes de correo
electrónico pueden ser enviados de dos modos diferentes: Sincrónico o
Asincrónico. SendMail() espera por la finalización de la operación de
envío (Send) y luego retorna un error o información de finalización con
un resultado .T. o .F.. Si se retorna .F., puedes verificar la
propiedad cErrorMsg para ver el error que ocurrió.
SendMailAsync() envía el
mensaje sin esperar por un resultado. La operación corre en un hilo separado,
de manera que para tu aplicación parece que el retorno fuera instantáneo.
Cuando se corren aplicaciones Web en particular, éste es el modo preferido de
enviar mensajes, para evitar el bloqueo del servidor mientras espera que se
complete la operación de envío de correo.
Nota que SMTP es un
protocolo basado en servidor, lo que significa que los mensajes enviados a él
están presentados pero no necesariamente son procesados inmediatamente. Esto
significa que, aun si la llamada sincrónica SendMail() retorna un código
de estado bueno, no hay garantía que el mensaje de correo electrónico haya
llegado realmente a su destinatario. La única manera de averiguar por una
dirección de correo electrónico no válida o por una casilla de correo cerrada
es el correo de retorno que arribará en tu propia casilla.
Transferencias FTP
wwIPStuff provee un número de
funciones FTP que facilitan el "subir" y "descargar"
archivos. Las funciones FTP están implementadas usando código que conversa con
las funciones FTP del sistema WinInet.dll. No tengo suficiente espacio aquí
para publicar el código fuente, pero puedes analizar el código completo en
wwIPStuff.vcx.
Para descargar un archivo vía
FTP, usa el siguiente código:
SET CLASSLIB TO wwIPStuff ADDITIVE
SET PROCEDURE TO wwUtils ADDITIVE
loFTP = CREATEOBJECT("wwFTP")
lnResult =
loFTP.FTPGetFile("ftp.westwind.com", "pkunzip.exe", ;
"c: emppkunzip.exe")
IF lnResult # 0
? loFTP.cErrorMsg
RETURN
ENDIF
FTPGetFile() es un llamado
sincrónico puro que toma un archivo en línea y lo descarga como un archivo
local. Como es sincrónico y no provee ninguna información de estado sobre la
transferencia de archivos grandes, esta función podría hacer pensar a los
usuarios que su máquina se ha bloqueado.
Para trabajar alrededor de este
problema, está FTPGetEx(), que soporta llamadas a métodos de evento que
te permiten cancelar una descarga y manejar una visualización de estado en
pantalla. Para hacerlo, debes crear una subclase de wwFTP o arrastrarla sobre
un formulario para implementar el método OnFTPBufferUpdate(). El código
completo es similar a éste:
SET CLASSLIB TO wwIPStuff additive
SET PROCEDURE TO wwUtils additive
PUBLIC o
o = CREATEOBJECT("myFTP")
WAIT WINDOW NOWAIT "Alt-x to abort
download..."
ON KEY LABEL ALT-X o.lCancelDownload =
.T.
IF o.FTPConnect("ftp.west-wind.com")
# 0
? o.nError
? o.cErrorMsg
RETURN
ENDIF
IF
o.FtpGetFileEx("wconnect.zip","c: empwconnect.zip") # 0
? o.nError
? o.cErrorMsg
RETURN
ENDIF
ON KEY LABEL ALT-X
RETURN
DEFINE CLASS myFtp AS wwFTP
FUNCTION OnFTPBufferUpdate
LPARAMETER lnBytesDownloaded,
lnBufferReads, lcCurrentChunk
DO CASE
CASE lnBufferReads > 0
WAIT WINDOW "Bytes read: " +
TRANSFORM(lnBytesDownloaded) NOWAIT
*** DoEvents
*** Manejar eventos de la interfase de
usuario como el click de un Botón Cancelar
CASE lnBufferReads = -1
WAIT WINDOW "Download
aborted..." TIMEOUT 2
ENDCASE
RETURN
ENDDEFINE
Aquí estoy usando el
comando Alt-X ON KEY LABEL para capturar una cancelación de la descarga
definiendo la bandera del objeto FTP lCancelDownload a .T. Cuando
esta bandera es verdadera, el código FTP termina cuando el próximo bloque de
datos esté por ser aceptado.
Para poder mostrar información de
estado durante la descarga, el método recibe un número total de bytes
descargados. Los parámetros para este método contienen le número actual de bytes
recibidos, el número de lecturas que han ocurrido hasta el momento y el bloque
de datos actualmente leído. Este último ítem es útil para construir una salida
incremental para datos no binarios que pueden ser leídos a medida que llegan.
El parámetro lnBufferReads contiene un número mayor que 0 mientras se está
leyendo y -1 si ocurrió un error o si la operación fue cancelada (o sea,
si lCancelDownload = .T.).
Si necesitas controlar otros
elementos de la Interfase de Usuario, como un formulario con un botón Cancelar,
debes asegurarte que llamas a DoEvents en la rutina actualizada de modo que el
evento de la Interfase de Usuario pueda dispararse y correr.
Puedes también "subir"
archivos de la misma manera usando los métodos FTPSend y FTPSendEx. He
aquí un ejemplo con FTPSend (la versión con SendEx provee los mismos
"eventos" OnFTPBufferUpdate como el método FTPGetFileEx method):
o = CREATEOBJECT("wwFTP")
lnResult =
o.FTPSendFile("ftp.west-wind.com", "c: emppkunzip.exe", ;
"/pkunzip.exe", "username", "password")
"/pkunzip.exe", "username", "password")
IF lnResult # 0
? o.cErrorMsg
ENDIF
Nota que el nombre de usuario y
la contraseña se requieren sólo si "subes" archivos a un directorio
restringido que no permite el acceso a usuarios anónimos. Este es generalmente
el caso para las "subidas" FTP, pero depende enteramente del
administrador del sitio configurar estos permisos
En adición a estas funciones,
puedes obtener una listado de directorio FTP y borrar archivos en el servidor
usando los métodos aFTPDir y FTPDeleteFile del objeto wwFTP. Échale una
mirada a la biblioteca de clases ya al archivo de ayuda HTML incluido para más
detalles sobre cómo llamar a estos métodos.
WwIPStuff – funcionalidad HTTP
La más potente característica de
WwIPStuff es su funcionalidad HTTP. Hablaré más sobre esto más adelante en este
artículo, pero en su forma básica provee un fácil mecanismo para recuperar
contenido Web de cualquier URL HTTP.
La forma más fácil de comenzar es
con el método HTTPGet, que es una manera simple de recuperar contenido Web en
una cadena de texto con una única llamada. Para usarlo, simplemente debes hacer:
O=CREATEOBJECT("wwIPStuff")
*** Recuperación simple de datos
lcResult = o.HTTPGet(“http://www.west-wind.com/”)
lcResult = o.HTTPGet(“http://localhost/datafile.dat”)
lcResult = o.HTTPGet(“http://localhost/report.pdf”)
lcResult = o.HTTPGet(“http://localhost/datafile.dat”)
lcResult = o.HTTPGet(“http://localhost/report.pdf”)
que recupera el contenido
completo de una página Web en una cadena de texto. Nota que puedes traer
cualquier clase de contenido Web que el servidor tenga disponible. Las dos
últimas solicitudes traen información binaria del servidor – un archivo de
datos y un documento Adobe PDF – que puedes recuperar fácilmente y guardar en
un archivo con la nueva función de VFP STRTOFILE.
Es también posible enviar
información al servidor por medio de POST. POST es un mecanismo estándar HTTP
para enviar información a un servidor. Usas operaciones POST toda vez que
envías un formulario HTML en una página Web sobre Internet. El explorador
codifica los datos del formulario en un buffer POST que es enviado al
servidor Web que a su turno puede recuperar estas variables como parte de la
solicitud Web. En las Páginas Activas de Servidor (ASP) y con Web Connection
usarías la colección Request.Form() para recuperar estos datos en una aplicación
servidora.
Para usar POST emplea un código
como el siguiente:
lcData = ""
lnSize = 0
o.HTTPConnect(“www.west-wind.com”,”rstrahl”,”Password”)
o.AddPostKey(“Name”,”Rick”)
o.AddPostKey(“Company”,”West Wind
Technologies”)
lnResult = o.HTTPGetEx(“/scripts/wc.dll?PostTest”,;
@lcData,@lnSize)
o.HTTPClose()
A diferencia de la operación
HTTPGet que maneja todo en una única llamada al método, HTTPGetEx requiere
varias llamadas para abrir, agregar datos al buffer de entrada, enviar
y, finalmente, cerrar la conexión con el servidor Web. Nota que tienes que
pasar los datos del buffer y el parámetro de tamaño por
referencia – estos valores son definidos en la llamada al método. Puedes
especificar un buffer pre-dimensionado y un tamaño que limitará la cantidad de
datos recuperados a ese valor. Definiendo el buffer con la cadena
nula ("") y el tamaño a 0 significa que el tamaño del
buffer es asignado dinámicamente. Usar un tamaño fijo puede ser útil si sólo
quieres hacer 'ping' a un sitio o recuperar sólo un encabezado.
Aunque HTTPGetEx está allí
primariamente para proveer la funcionalidad POST, realmente no tienes que
enviar ninguna variable al servidor con POST. El método da mucho más control
sobre las solicitudes HTTP de modo que puedes usarlo también para una
operación de captura pura (GET) que requiere más control:
¨
Conexiones seguras sobre HTTPS/SSL
¨
Validación de contraseñas vía Autenticación Básica.
¨
Buffers de entrada con tamaño asignado dinámicamente
¨
Notificación de eventos mientras una descarga está en progreso
¨
Recuperar encabezados de HTTP (propiedad cHTTPHeaders)
En general HTTPGetEx es
mucho más flexible, pero HTTPGet() es obviamente más fácil de usar.
Usa HTTPGet cuando simplemente necesites recuperar datos sin ninguna opción
especial. En todos los otros casos puedes usar HTTPGetEx.
WwIPStuff provee una cantidad de
otros métodos y objetos relacionados con el acceso HTTP que incluyen:
¨
Correr instrucciones SQL sobre HTTP (requiere código servidor
de VFP)
¨
Transferir archivos sobre HTTP
¨
Operaciones asincrónicas de HTTPGetAsync y HTTPGetExAsync
Puedes encontrar más en el
archivo de ayuda HTML wwIPStuff.chm.
Acceso de Datos sobre TCP/IP
He discutido la provisión de
datos a aplicaciones cliente en gran detalle en este libro. He mostrado
soluciones servidoras puras que manejan la entrega de contenido de datos para
ser mostrados en el cliente y he mostrado como transportar datos sobre HTTP
usando RDS y wwIPStuff. No obstante, hay otra manera, potencialmente más
fácil, de acceder a datos sobre Internet usando el protocolo TCP/IP. TCP/IP es
justamente otro protocolo de red soportado por Windows por lo que es posible
usar la Internet como una red gigante para acceder a datos y recursos
directamente sobre Internet.
Accediendo a datos VFP directamente sobre TCP/IP
Por ejemplo, me es enteramente
posible conectarme a mi servidor Web en Oregon desde mi casa en Hawaii
usando lo siguiente:
USE
www.west-wind.comd$webappswwdemoguest.dbf
Nota: El uso de direcciones IP y
nombres de dominio con referencias UNC sólo funciona con Windows NT (Win2000).
Para Win95/98 tienes que definir entradas LMHOSTS para asignar las direcciones
de IP a nombres de Netbios.
El comando de arriba me conectará
a mi servidor Web y abrirá el archivo Guest.dbf que entonces podré usar como
cualquier otra tabla de VFP. Aunque esto funciona bien, el proceso es lento aun
con una tabla pequeña. El problema es que las conexiones remotas como esta
toman su tiempo para efectuarse sobre Internet. Usando una conexión de discado
de 56k toma aproximadamente un minuto para realizar la conexión de arriba
con un archivo de aproximadamente 200 registros. En este caso la sobrecarga es el
tiempo de conexión. Si tus archivos contienen muchos datos con archivos de
índices, al abrir un archivo en el servidor causará que toda la información del
índice se trasmita sobre la conexión lenta haciéndola todavía más lenta.
Una vez que la conexión inicial
se ha establecido y la tabla está abierta a través de ella, la operación es
razonablemente rápida pero depende del tamaño del archivo de datos. Si el
índice es pequeño y se usa caché local, las búsquedas pueden ser muy rápidas.
No obstante, si el índice no es descargado completamente podrás observar largas
demoras a medida que VFP trae más información del índice para efectuar la
búsqueda. Sobre conexiones lentas, el indexado de VFP y la
optimización Rushmore que lo requiere puede convertirse en una desventaja
al requerir que sean descargados inicialmente más datos que los necesarios.
Aquí puedes ver el problema con
una herramienta de base de datos basada en archivos como VFP – lleva a cabo
todo su procesamiento en el lado cliente, de manera que cuando los datos están
en el lado servidor con una conexión lenta, el cliente necesita traer toda la
información necesaria para realizar las búsquedas y obtener los datos
requeridos. Esto puede requerir cantidades significativas de datos localmente
causando un incremento de tráfico sobre la conexión de red. En este escenario
en que SQL Server realiza el procesamiento en el servidor y luego retorna sólo
el resultado, es mucho más eficiente. Analizaré esto en la siguiente sección.
Deberías notar un punto
importante ahora – si hubieras tratado de conectarte a mi servidor Web usando
el USE y la sintaxis UNC de arriba no habrías podido. Y esto es una cosa buena
– obviamente no deberías tener acceso a mis tablas en mi servidor Web dado que
no tienes permisos en esa máquina. Para aplicaciones que quieran usar el acceso
a archivos con TCP/IP, esto significa que necesitas establecer apropiadamente
la seguridad NT usando una cuenta NT específica con los derechos de acceso
requeridos. Este nombre de usuario puede ser ya sea una cuenta de aplicación
genérica o una contraseña de usuario particular provista por el usuario. Notar
que NT puede validar la seguridad a través de una conexión Internet
automáticamente. Estoy conectado en mi máquina local como el usuario rstrahl y
esa misma cuenta existe en el servidor con la misma contraseña; la validación
de paso a través me permite acceder al servidor automáticamente sin tener que conectarme
como usuario. Si trato de conectarme con un nombre de usuario diferente
emergerá el diálogo de NT requiriéndome que ingrese una cuenta de usuario
válida para el servidor. El comportamiento es idéntico a la manera que usarías
una conexión LAN con NT o Win9x.
Otra cuestión relacionada es la
seguridad de datos. Una vez que estás conectado y la información se está transfiriendo
sobre la conexión Internet, esos datos no están encriptados de ninguna manera.
Esto significa que cualquiera con un analizador de protocolo puede capturar los
datos desde el cable.
Usando SQL Server sobre TCP/IP
Justamente como puedes acceder a
archivos DBF sobre Internet también puedes acceder a SQL Server de la
misma manera. Si estás usando Microsoft SQL Server puedes configurar ese
servidor para usar TCP/IP como su protocolo de red (con SQL Server 7.0 este es
el protocolo por defecto – SQL Server 6.5 usa Named Pipes por
defecto y mantendrá esa configuración si es actualizado a 7.0). Una vez que
hayas configurado el servidor con TCP/IP podrás conectarte al servidor como
sigue:
lnHandle = SQLSTRINGCONNECT(“driver={SQL
Server};server=www.west-wind.com;” + ;
“database=Pubs;uid=sa;pwd=;”)
SQLEXEC(lnHandle,”SELECT * FROM Authors”)
BROWSE
SQLEXEC(lnHandle,”SELECT * FROM Authors”)
BROWSE
Esto también trabaja de acuerdo
con lo esperado. No obstante, igualmente que con el acceso directo a una tabla
VFP la conexión puede tomar un largo tiempo. Sobre la misma conexión de discado
el tiempo de conexión al servidor es de alrededor de 1 minuto. Una vez que está
establecida la conexión, el SQL Server remoto corre la consulta y luego retorna
sólo los resultados sobre Internet. En este aspecto el acceso es
muy eficiente y deberías poder correr consultas bastante eficientemente aun con
una conexión lenta, suponiendo que retornas cantidades razonables de
información. Dado que la lentitud proviene primariamente del tiempo de
conexión, querrás configurar tu aplicación de manera que abra la conexión al
inicio y mantenga esa conexión abierta para todas las consultas futuras sobre
ese servidor. Si usas conexiones persistentes en tus aplicaciones la velocidad
incluso sobre conexiones a Internet lentas puede ser muy buena, ya que sólo se
envían las cadenas con la consulta hacia el servidor y se retornan los
conjuntos de resultados desde el servidor.
Hay un par de problemas con este
esquema y ambos tienen que ver con la seguridad. Para permitir el acceso a SQL
Server estás esencialmente abriendo dicho servidor a la Internet. Cualquiera
puede acceder ese servidor y potencialmente deja la posibilidad
No hay comentarios. :
Publicar un comentario
Los comentarios son moderados, por lo que pueden demorar varias horas para su publicación.