Primeros pasos
En menos de 5 minutos tendras un servidor HTTP corriendo en VFP y respondiendo peticiones REST.
Prerrequisitos
- FoxServer instalado y con licencia activa
- VFP 9 SP2 o superior instalado
- WinFx instalado (generador visual de proyectos, opcional pero recomendado)
1. Crear el proyecto
Abre WinFx y crea un nuevo proyecto de tipo API. Esto genera automaticamente la estructura de carpetas y el archivo de configuracion.
Alternativamente, crea manualmente un archivo .prg con el controlador:
2. Definir el controlador
El controlador es una clase VFP que hereda de ApiController. Cada metodo publico con un comentario HELP es un endpoint:
* HelloController.prg
DEFINE CLASS HelloController AS ApiController OLEPUBLIC
PROCEDURE GetHello(req, res) HELP "GET: hello public"
LOCAL loResp
loResp = THIS.newObject("status,message")
loResp.status = "success"
loResp.message = "Hello from FoxServer!"
res.status(200).json(THIS.ToJson(loResp))
ENDPROC
PROCEDURE GetVersion(req, res) HELP "GET: hello/version public"
LOCAL loResp
loResp = THIS.newObject("version,server")
loResp.version = "1.0.0"
loResp.server = "FoxServer"
res.status(200).json(THIS.ToJson(loResp))
ENDPROC
ENDDEFINE | Elemento | Descripcion |
|---|---|
ApiController | Clase base de FoxServer — aporta request, response y utilidades JSON |
HELP "GET: hello public" | Declara el endpoint: metodo HTTP + ruta + visibilidad (public = sin JWT) |
req | Objeto con toda la informacion de la peticion entrante |
res | Objeto para construir y enviar la respuesta HTTP |
THIS.newObject(campos) | Crea un objeto VFP dinamico con las propiedades indicadas |
THIS.ToJson(obj) | Serializa un objeto VFP a cadena JSON |
res.status(200).json(json) | Envia respuesta con codigo HTTP 200 y body JSON |
3. Compilar el proyecto
Compila desde WinFx o desde VFP. El compilador genera un archivo DLL Interop que FoxServer carga.
4. Arrancar el servidor
Inicia FoxServer apuntando a tu proyecto compilado. Si usas el modo servicio de Windows, consulta la seccion de Funciones Avanzadas.
FoxServer.exe --project "C:\MiProyecto\config\myapi.json" 5. Probar el endpoint
Con el servidor corriendo en el puerto 8080, prueba desde curl, Postman o el navegador:
# GET /api/hello
curl http://localhost:8080/api/hello
# Response:
# {"status":"success","message":"Hello from FoxServer!"} Agregar parametros en la URL
Los parametros se declaran entre llaves en la ruta y se acceden via req.params:
PROCEDURE GetUser(req, res) HELP "GET: users/{id} public"
LOCAL lcId, loResp
lcId = req.params.id && "123" from /api/users/123
loResp = THIS.newObject("id,found")
loResp.id = lcId
loResp.found = .T.
res.status(200).json(THIS.ToJson(loResp))
ENDPROC curl http://localhost:8080/api/users/123
# {"id":"123","found":true} Leer el body (POST)
Para peticiones POST con JSON body, accede a req.json:
PROCEDURE PostProduct(req, res) HELP "POST: products public"
LOCAL loBody, loResp
&& Body: {"name":"Widget","price":9.99}
IF ISNULL(req.json) OR EMPTY(req.json.name)
res.status(400).json('{"error":"name is required"}')
RETURN
ENDIF
loResp = THIS.newObject("status,name,price")
loResp.status = "created"
loResp.name = req.json.name
loResp.price = req.json.price
res.status(201).json(THIS.ToJson(loResp))
ENDPROC curl -X POST http://localhost:8080/api/products \
-H "Content-Type: application/json" \
-d '{"name":"Widget","price":9.99}'
# {"status":"created","name":"Widget","price":9.99}