Enviar archivo usando API REST en VFP [SOLUCIONADO]

Integración de APIs REST en Visual FoxPro

Cuando nos enfrentamos a la necesidad de integrar Visual FoxPro (VFP) con servicios modernos basados en APIs REST, a menudo nos encontramos ante el desafío de adaptar lenguajes de programación con un largo recorrido y estables en el sector empresarial, para operar con paradigmas más recientes. En este contexto, una de las tareas demandadas frecuentemente es la capacidad de enviar archivos a través de una API REST, lo cual permite una integración ágil con otros sistemas y plataformas.

Aunque VFP no cuenta con herramientas incorporadas para realizar llamadas HTTP modernas de forma nativa, sí existe la posibilidad de extender sus capacidades mediante el uso de librerías externas o recursos del sistema operativo. A continuación, abordaremos una serie de pasos y fragmentos de código que nos permitirán comprender cómo enviar un archivo a un servicio web utilizando VFP.

Utilizando WININET para conexión HTTP

Una manera de realizar llamadas a una API REST desde VFP es utilizar la biblioteca de Windows WININET. Este conjunto de funciones permite crear y manejar sesiones HTTP. A continuación, se presenta un ejemplo de cómo podríamos implementar una función para enviar un archivo.

    LPARAMETERS tcUrl, tcFile
    LOCAL lnHandle, lcBuffer, lnBytesRead, lcData, lnResult
    
    * Abre el archivo a enviar
    lnHandle = FOPEN(tcFile, 1)
    IF lnHandle < 0
        RETURN .F.
    ENDIF
    lcData = ''
    lnBytesRead = 1
    WHILE lnBytesRead > 0
        lcBuffer = SPACE(4096)
        lnBytesRead = FREAD(lnHandle, @lcBuffer, LEN(lcBuffer))
        lcData = lcData + LEFT(lcBuffer, lnBytesReady)
    ENDDO
    FCLOSE(lnHandle)

    * Establece una conexión con el API utilizando WININET
    LOCAL lnINet, lnINetConn, lnINetReq, lcHeaders
    lnINet = InternetOpen('VFP app', 1, '', '', 0)
    lnINetConn = InternetConnect(lnINet, URL_SERVER, INTERNET_DEFAULT_HTTP_PORT, '', '', INTERNET_SERVICE_HTTP, 0, 0)
    lcHeaders = 'Content-Type: application/octet-stream'
    lnINetReq = HttpOpenRequest(lnINetConn, 'PUT', URL_RESOURCE, 'HTTP/1.1', '', '', INTERNET_FLAG_RELOAD, 0)

    * Envía el archivo
    lnResult = HttpSendRequest(lnINetReq, lcHeaders, LEN(lcHeaders), @lcData, LEN(lcData))

    * Cierra conexiones
    InternetCloseHandle(lnINetReq)
    InternetCloseHandle(lnINetConn)
    InternetCloseHandle(lnINet)

    RETURN lnResult
    

El código presentado hace uso intensivo de las funciones WININET para establecer una conexión, abrir una solicitud HTTP y enviar los datos del archivo mediante una petición PUT.

Automatización a través de Componentes COM

Otra táctica consiste en utilizar componentes COM que permitan la realización de peticiones HTTP de una forma más completa o con características que WININET no pueda ofrecer. Microsoft XML HTTP (MSXML) es uno de estos componentes comúnmente utilizado para este propósito.

    LPARAMETERS tcUrl, tcFile
    LOCAL loXMLHTTP, lcData
    
    * Se crea una instancia del Objeto MSXML2.XMLHTTP
    loXMLHTTP = CREATEOBJECT('MSXML2.XMLHTTP')
    
    * Asegúrate de que el archivo existe
    IF NOT FILE(tcFile)
        ? 'El archivo no existe.'
        RETURN .F.
    ENDIF
    
    * Abre el archivo a enviar
    lcData = FILETOSTR(tcFile)
    
    * Construye y envía la petición
    loXMLHTTP.Open('PUT', tcUrl, .F.)
    loXMLHTTP.setRequestHeader('Content-Type', 'application/octet-stream')
    loXMLHTTP.send(lcData)
    
    * Espera la respuesta de la petición
    DO WHILE loXMLHTTP.readyState != 4
        DOEVENTS
    ENDDO
    
    * Revisa la respuesta del servidor
    IF loXMLHTTP.status = 200
        ? 'Archivo enviado correctamente.'
    ELSE
        ? 'Error al enviar archivo: ' + loXMLHTTP.statusText
    ENDIF
    
    * Limpia objetos
    RELEASE loXMLHTTP
    

Una ventaja de usar MSXML2.XMLHTTP es que nos provee de un modelo de eventos que permite realizar llamadas asíncronas y esperar por la respuesta del servidor, lo cual puede ser de utilidad para no bloquear la interfaz gráfica en aplicaciones que lo requieran.

Consideraciones de Seguridad y Gestión de Errores

Es imperativo incluir en nuestro código una gestión adecuada de errores y tomar en cuenta las aspectos relacionados con la seguridad. Por ejemplo, se debe validar siempre el tamaño y el tipo del archivo a enviar para evitar ataques de tipo Buffer Overflow o la subida de archivos maliciosos.

Además, si la API que se está utilizando es pública o expone datos sensibles, es fundamental contar con una segura autenticación y cifrado de la comunicación. Esto último podría lograrse asegurándonos de que las peticiones se llevan a cabo a través de HTTPS y autenticando la petición con tokens JWT, OAuth o algún otro esquema de autorización que la API soporte.

Conectando con APIs REST Modernas

Pese a que VFP puede no tener un soporte inmediato para modernas APIs REST, utilizando las herramientas adecuadas y un poco de ingenio, es posible extender la funcionalidad del sistema para interactuar con ellas. El truco está en comprender la base de las comunicaciones HTTP y hacer uso de los componentes e interfaces que el sistema operativo provee.

Mejorando la Experiencia de Usuario

Si bien hemos visto que la operatividad esencial para interactuar con APIs se puede conseguir, siempre es recomendable considerar la experiencia de usuario al implementar este tipo de funcionalidades. Evitar largas esperas, bloqueos de la interfaz o mensajes de error incomprensibles son detalles que, si se cuidan, pueden marcar la diferencia entre una implementación funcional y una implementación exitosa.

Conclusiones Provisoria

Las posibilidades que ofrece VFP se amplían en gran medida cuando se le suma la capacidad de trabajar con tecnologías web actuales como lo son las APIs REST. Aunque existen ciertas limitaciones inherentes a trabajar con un lenguaje que ha dejado de ser actualizado, aún hay muchos caminos disponibles que nos permiten mantener nuestras aplicaciones VFP integradas, funcionales y efectivas en el presente panorama tecnológico.

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Más información
Privacidad