4 de enero de 2001

Habilitando aplicaciones de Visual FoxPro para Internet

Habilitando aplicaciones de Visual FoxPro para Internet
Ó Rick Strahl, West Wind Technologies, 1999
http://www.west-wind.com

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.
¨ 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.
¨ 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.

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.
¨ 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.

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/")

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
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")
"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")
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”)
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
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