Api Rest con activeVFP

73 views
Skip to first unread message

Jorge zapata

unread,
Oct 17, 2023, 2:48:10 PM10/17/23
to ActiveVFP
Encontre en Youtube este Interesante el video (del canal de Guillermo Giménez), en el cual explica como desplegar Api Rest con activeVFP además adjunta el Código fuente.

https://youtu.be/BmN5zXbHvjY


Victor Espina

unread,
Oct 17, 2023, 4:29:12 PM10/17/23
to ActiveVFP
Buen video... me gusto su idea de tener una implementacion minima para crear interfaces REST rapidamente.  Sin embargo hay varios errores de concepto en lo que explica; cosas que se pueden manejar mucho mas facilmente utilizando las bondades ya disponibles en la clase avfpRESTController y el el DELEGATE.PRG.

1) La apertura de archivos puede hacerse directo en el archivo DELEGATE.PRG,  sobre escribiendo el metodo beforeHandleRequest.  Ese evento se invoca siempre antes de pasar el control al endpoint de cualquier controller.

2) No es necesario fijar a mano el valor de oResponse.contentType.  En su lugar, se pueden usar distintos metodos disponibles en el controlador, dependiendo de lo que se quiera devolver:

  • JSON:  returnJSON()
  • HTTP Status: returnStatusCode()
  • XML: returnXML()
  • PDF: returnPDF()
  • Binary stream: returnStream()

3) No es necesario hacer parsing del contenido de un request POST/PUT con contentType: application/json, como se hizo en el video; esa tarea la realiza automaticamente el controller y puedes tener acceso tanto a la data original como a la data ya convertida a JSON, usando propiedades del controlador:

  • rawData:  data original recibida en texto plano
  • Data:  objeto JSON (en caso de que ContentType sea application/json)

De esta forma, si enviamos un request POST con la data { "nombre": "Victor". "apellido": "Espina"}, podemos recupperar esos datos en el controller simplemente usando la propiedad data:

cNombre = THIS.Data.nombre
cApellido = THIS.Data.apellido


4) En el caso de las aplicaciones REST yo recomiendo siempre retornar un objeto con la siguiente estructura:

{
   "result": boolean,
   "errormsg": string,
  "data": object
}

Esto le permite al cliente que consume el servicio REST saber si su requerimiento se proceso con exito (result = true) o, de lo contrario, tener una descripcion del error ocurrid (errormsg), pudiendo acceder a cualquier data retornada por el endpoint con la propiedad "data".   La clase avfpRestController ofrece un metodo llamado Response() que genera un objeto de este tipo.    De hecho, la estructura de un endpoint tipico deberia ser algo similar a esto:

PROCEDURE nombreEndpoint
   LOCAL oResp
   oResp = THIS.Response()
   TRY
        && AQUI VA SU CODIGO

        && EJEMPLO DE VALIDACION:
        IF condicion
           oResp.errormsg = "Descripcion del error"
           THROW oResp.errormsg
        ENDIF
   CATCH TO ex
       oResp.errorMsg = EVL(oResp.errorMsg, ex.Message)
   ENDTRY
   RETURN oResp


CUando el endpoint retorna un objeto, el controlador entiende que debe restornar los datos en forma de un string JSON, por lo que procedera a serializar el objeto devuelto y anexara el header "Content-Type: application/json" automaticamente a la respuesta retornada.


Voy a considerar seriamente dedicar unas horas a preparar una distribucion de ActiveVFP orientada exclusivamente a la creacion de API REST, incluyendo un pequeño manual actualizado con ejemplos sober como crear los endpoints, porque creo que es el area donde mas provecho se le puede sacar a ActiveVFP en este momento.  Tengo la idea tambien de explorar la posibilidad de integrar ActiveVFP con un "loader" creado en .NET, de modo que pueda funcionar sin la necesidad de IIS.

Saludos

Victor Espina

Victor Espina

unread,
Oct 17, 2023, 4:30:13 PM10/17/23
to ActiveVFP
Pequeña correccion en el codigo de ejemplo:

PROCEDURE nombreEndpoint
   LOCAL oResp
   oResp = THIS.Response()
   TRY
        && AQUI VA SU CODIGO

        && EJEMPLO DE VALIDACION:
        IF condicion
           oResp.errormsg = "Descripcion del error"
           THROW oResp.errormsg
        ENDIF
   CATCH TO ex
       oResp.errorMsg = EVL(oResp.errorMsg, ex.Message)
   ENDTRY
   oResp.result = EMPTY(oResp.errormsg)
   RETURN oResp


Saludos

Victor Espina

martin bonansea

unread,
Oct 17, 2023, 4:40:52 PM10/17/23
to acti...@googlegroups.com
Excelente Victor!!!!
Si podemos ayudar con algo solo avisanos.
Saludos cordiales


--
Has recibido este mensaje porque estás suscrito al grupo "ActiveVFP" de Grupos de Google.
Para cancelar la suscripción a este grupo y dejar de recibir sus mensajes, envía un correo electrónico a activevfp+...@googlegroups.com.
Para ver esta conversación en el sitio web, visita https://groups.google.com/d/msgid/activevfp/f9640283-7942-4eb4-a8ee-78bd92754b95n%40googlegroups.com.

Walter Valle

unread,
Oct 19, 2023, 12:14:54 PM10/19/23
to ActiveVFP
Hola Victor!

Genial explicación pana! Lo de la distro y manual actualizado para API REST es una gran idea.

Saludos,

Walter Valle
San Pedro Sula, Honduras.
VFP9 SP2 + SQLServer
Reply all
Reply to author
Forward
0 new messages