IR
irwinrodriguez.dev
Volver a documentacion

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
ElementoDescripcion
ApiControllerClase base de FoxServer — aporta request, response y utilidades JSON
HELP "GET: hello public"Declara el endpoint: metodo HTTP + ruta + visibilidad (public = sin JWT)
reqObjeto con toda la informacion de la peticion entrante
resObjeto 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}

Siguientes pasos