IR
irwinrodriguez.dev
Zuruck zur Dokumentation

Erste Schritte

In weniger als 5 Minuten haben Sie einen HTTP-Server, der in VFP lauft und auf REST-Anfragen antwortet.

Voraussetzungen

  • FoxServer installiert und lizenziert
  • VFP 9 SP2 oder hoher installiert
  • WinFx installiert (visueller Projektgenerator, optional aber empfohlen)

1. Projekt erstellen

Offnen Sie WinFx und erstellen Sie ein neues API-Projekt. Dadurch wird automatisch die Ordnerstruktur und die Konfigurationsdatei generiert.

Alternativ konnen Sie manuell eine .prg-Datei mit dem Controller erstellen:

2. Controller definieren

Der Controller ist eine VFP-Klasse, die von ApiController erbt. Jede offentliche Methode mit einem HELP-Kommentar ist ein Endpunkt:

* 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
ElementBeschreibung
ApiControllerFoxServer-Basisklasse — stellt Request, Response und JSON-Dienstprogramme bereit
HELP "GET: hello public"Deklariert den Endpunkt: HTTP-Methode + Route + Sichtbarkeit (public = kein JWT)
reqObjekt mit allen Informationen uber die eingehende Anfrage
resObjekt zum Erstellen und Senden der HTTP-Antwort
THIS.newObject(Felder)Erstellt ein dynamisches VFP-Objekt mit den angegebenen Eigenschaften
THIS.ToJson(obj)Serialisiert ein VFP-Objekt in einen JSON-String
res.status(200).json(json)Sendet Antwort mit HTTP-Code 200 und JSON-Body

3. Projekt kompilieren

Kompilieren Sie aus WinFx oder aus VFP heraus. Der Compiler generiert eine Interop-DLL-Datei, die FoxServer ladt.

4. Server starten

Starten Sie FoxServer und verweisen Sie auf Ihr kompiliertes Projekt. Wenn Sie den Windows-Dienstmodus verwenden, lesen Sie den Abschnitt Erweiterte Funktionen.

FoxServer.exe --project "C:\MiProyecto\config\myapi.json"

5. Endpunkt testen

Wenn der Server auf Port 8080 lauft, testen Sie mit curl, Postman oder dem Browser:

# GET /api/hello
curl http://localhost:8080/api/hello

# Response:
# {"status":"success","message":"Hello from FoxServer!"}

URL-Parameter hinzufugen

Parameter werden in geschweiften Klammern in der Route deklariert und uber req.params abgerufen:

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}

Body lesen (POST)

Fur POST-Anfragen mit JSON-Body verwenden Sie 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}

Nachste Schritte