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