Ich habe in der FoxPro-Community, auf Patreon und in der WhatsApp-Gruppe, eine Umfrage mit einer einzigen Frage gemacht: Was ist heute das Schwierigste an Ihrer VFP-Anwendung? Zwei von drei antworteten dasselbe: sie im Web oder als API bereitzustellen. Die Daten und die Logik, die sie bereits haben, in etwas zu bringen, das ein Browser, eine mobile App oder ein Programm einer anderen Firma aufrufen kann.
Dieses Tutorial ist die Antwort auf diese Frage, und zwar aus der Visual-FoxPro-IDE, der altbekannten. Am Ende haben Sie eine REST-API, die eine DBF-Tabelle als JSON zurückgibt und neue Datensätze annimmt. Der Code ist ganz normales VFP 9, und Sie fassen die Anwendung, die Sie bereits haben, nicht an: Sie veröffentlichen sie.
Ich fange bei null an: Visual FoxPro ist geschlossen. Jeder Schritt sagt, was Sie anklicken, was Sie schreiben und was Sie auf dem Bildschirm sehen müssen. Wenn das, was Sie sehen, irgendwann nicht dem Screenshot ähnelt, halten Sie dort an: Direkt darunter erkläre ich, warum das passiert und wie man es behebt.
Die Screenshots sind auf Englisch. Visual FoxPro 9 gibt es nur auf Englisch, und FoxForge hat keine deutsche Oberfläche: Sie benutzen es auf Englisch, und so erscheint es auch in den Bildern. Einige Windows-Dialoge (Speichern, Ersetzen) und die Beispieldaten stammen von einem spanischen System; auf Ihrem Rechner sehen Sie dieselben Dialoge auf Deutsch.
Sind Sie auf der Kommandozeile mehr zu Hause? Es gibt dasselbe Tutorial als CLI-Version: dasselbe Projekt, dasselbe Ergebnis, mit Befehlen, die man in PowerShell einfügt.
Was Sie brauchen, bevor Sie anfangen
- Visual FoxPro 9 SP2, installiert. FoxServer kompiliert Ihr Projekt damit.
- FoxServer, installiert. Die 30-Tage-Testlizenz, die bei der Registrierung im Portal ausgestellt wird, reicht für alles hier. Das Setup hat am Ende nach der Lizenzdatei gefragt: Wenn Sie das übersprungen haben, führen Sie es noch einmal aus.
- Einen Browser, welchen auch immer Sie verwenden: Edge, Chrome oder Firefox.
- Die Berechtigung, Programme als Administrator auszuführen auf Ihrem Rechner. Das braucht es nur zum Kompilieren, und in Schritt 1 erkläre ich, warum.
Mehr nicht. Sie müssen keine Konsole öffnen und nichts zusätzlich installieren.
Drei Dinge, die man verstehen muss, bevor man eine Zeile schreibt
Wenn Sie aus diesem Artikel nur einen Kasten lesen, dann diesen.
1. Ihr Code bleibt Ihrer. Er wird nur veröffentlicht. FoxServer übersetzt nichts und zwingt Ihnen kein Framework auf. Eine PROCEDURE einer VFP-Klasse wird zum Endpunkt (einer Webadresse, die antwortet, wie http://127.0.0.1:8099/hola), indem man ihr eine HELP-Klausel hinzufügt:
PROCEDURE pHola(req, res) HELP "GET: hola public"
LOCAL loRes
loRes = THIS.newObject("mensaje")
loRes.mensaje = "hola"
RETURN THIS.Ok(loRes)
ENDPROCDas ist eine API. Der Rest des Artikels ist Detail.
2. Die Route existiert erst, wenn Sie kompilieren. Die Route entsteht in dieser HELP-Klausel und erreicht den Server erst, wenn das Projekt kompiliert wird. Das ist Ursache Nummer eins für „ich habe den Endpunkt hinzugefügt und bekomme ein 404“. Wenn Sie eine Route hinzufügen und sie nicht auftaucht: Es fehlt das Kompilieren.
3. Der Aufruf ist synchron. Ein Endpunkt, der zwei Sekunden braucht, braucht zwei Sekunden und belegt so lange seinen Platz. Für Abfragen ist das bequem; bei einem Vierzig-Sekunden-Prozess gibt man eine Kennung zurück und erledigt die Arbeit an anderer Stelle.
Schritt 1. Visual FoxPro als Administrator öffnen und FoxForge laden
FoxForge ist die Werkstatt, die FoxServer für die Visual-FoxPro-IDE installiert: ein zusätzliches Menü in der Menüleiste, neben File, Edit und Co., aus dem heraus man die Projekte anlegt. Es wird wie jede .app geladen, mit einem DO.
- Suchen Sie das Symbol von Visual FoxPro 9, das Sie immer verwenden: auf dem Desktop, in der Taskleiste oder im Startmenü.
- Klicken Sie mit der rechten Maustaste darauf und wählen Sie Als Administrator ausführen. Wo die Option steht, hängt davon ab, wo das Symbol liegt:
- Auf dem Desktop erscheint sie direkt im Kontextmenü.
- In der Taskleiste zeigt der erste Rechtsklick nur
vfp9.exe: Klicken Sie noch einmal mit der rechten Maustaste aufvfp9.exe, dort steht sie, wie im Bild. - Im Startmenü von Windows 11 steht sie unter Mehr.

Je nachdem, wie Ihr Windows eingerichtet ist, fragt es vor dem Öffnen womöglich, ob Sie zulassen wollen, dass die App Änderungen an Ihrem Gerät vornimmt. Das ist die Benutzerkontensteuerung: Wenn sie erscheint, antworten Sie mit Ja. Wenn nichts erscheint und die IDE sich direkt öffnet, ist das auch in Ordnung: Ihr Windows ist so eingestellt, dass es nicht fragt.
Warum als Administrator? Ihr Projekt wird als Multithread-COM-DLL kompiliert, dieselbe, die Sie mit BUILD MTDLL erzeugen würden. Nach dem Kompilieren registriert Visual FoxPro sie in Windows, und das darf nur ein Administrator. Ohne Rechte sieht es so aus, als ende das Kompilieren, aber es bleibt eine halbfertige DLL zurück, die der Server nicht verwenden kann. Nichts anderes braucht Administratorrechte: nur das Kompilieren.
- Gehen Sie bei geöffnetem Visual FoxPro in das Befehlsfenster. Wenn es nicht zu sehen ist: Menü Window › Command Window oder Strg+F2.
- Schreiben Sie diese zwei Zeilen und drücken Sie nach jeder die Eingabetaste:
CD "C:\Program Files (x86)\FoxServer\ide"
DO FoxForge.appDie Anführungszeichen beim CD sind nötig, weil der Pfad Leerzeichen enthält. Wenn Sie FoxServer in einen anderen Ordner installiert haben, ersetzen Sie den Pfad durch Ihren: Es ist der Ordner ide\ der Installation.
Nach einer Sekunde erscheint am Ende der Menüleiste ein neues Menü: FoxForge.

Wenn Sie lieber nichts schreiben möchten: Das FoxServer-Setup legt im Startmenü, im Ordner FoxServer, eine Verknüpfung namens Crear un proyecto (FoxForge) an (der Name ist auch in deutschem Windows spanisch), die Visual FoxPro mit dem Menü bereits geladen öffnet. Öffnen Sie auch diese mit Rechtsklick › Als Administrator ausführen.
Seit 0.9.30 lädt das Öffnen eines FoxServer-Projekts FoxForge von selbst, wenn FoxServer auf dem Rechner installiert ist und das Projekt mit dieser Version erstellt oder aktualisiert wurde. Um es schon vor dem Öffnen eines Projekts zu haben, verwenden Sie diese zwei Zeilen; wenn Sie es immer haben möchten, tragen Sie sie in Ihr Visual-FoxPro-Startprogramm ein. Es funktioniert genauso in Visual FoxPro 9 und in VFP Advanced (VFPA).
Schritt 2. FoxForge auf Englisch
FoxForge spricht Englisch und Spanisch, eine deutsche Oberfläche gibt es nicht. Wählen Sie Englisch: Unter FoxForge › Language muss English markiert sein, wie im Screenshot (wenn die Menüs auf Spanisch erscheinen: FoxForge › Idioma › Inglés). FoxForge merkt sich Ihre Wahl für die nächsten Male.

Ab hier nenne ich die FoxForge-Menüs auf Englisch. Die von Visual FoxPro ebenfalls, denn so erscheinen sie.
Schritt 3. Der Ordner für Ihre Projekte
Wir legen das Projekt in C:\proyectos ab (spanisch für „Projekte“; ich behalte den Namen, weil die Screenshots ihn so zeigen). Der Assistent im nächsten Schritt verlangt, dass der Ordner bereits existiert, also legen wir ihn jetzt an.
Öffnen Sie das Befehlsfenster von Visual FoxPro, wenn es nicht zu sehen ist: Menü Window › Command Window oder Strg+F2. Schreiben Sie diese Zeile und drücken Sie die Eingabetaste:
MD C:\proyectosWenn die Antwort lautet, dass der Ordner schon existiert, macht das nichts: Machen Sie weiter.
Ein anderer Ordner? Das Projekt kann liegen, wo Sie wollen, auch in Ihren Dokumenten. Hier verwenden wir
C:\proyectos, weil der Pfad kurz ist und sich die Pfade in den folgenden Schritten so besser lesen.
Schritt 4. Das Projekt anlegen
- Öffnen Sie das Menü FoxForge › New project › Web service / REST API (FoxServer).

- Es öffnet sich das Fenster New FoxServer project. Füllen Sie es so aus:
Die Namen bleiben in diesem Tutorial spanisch, weil die Screenshots sie so zeigen: Das Projekt heißt Almacen („Lager“).
| Feld | Was Sie eingeben |
|---|---|
| What is it called | Almacen. Das ist der Name der DLL, deshalb sind keine Akzente, Leerzeichen oder Symbole erlaubt: Wenn Sie „Almacén“ schreiben, macht der Assistent Almacen daraus und weist Sie mit „No accents, spaces or symbols in the name. Changed or removed:“ darauf hin |
| Port | 8099 |
| Where do I create it | C:\proyectos\ |
| What it is going to be | Lassen Sie die erste Option ausgewählt, REST API — the usual |
| Require a token to use the API (JWT) | Lassen Sie es deaktiviert |
Der Port ist die „Schalternummer“, an der Ihre API bedient: 8099 ist fast nie belegt.
Während Sie ausfüllen, zeigt der Kasten unten, was passieren wird. Dort muss Folgendes stehen:
Will be created in: C:\proyectos\Almacen\
Will answer at : http://127.0.0.1:8099/
127.0.0.1 ist Ihr eigener Rechner (localhost): Während der Entwicklung antwortet die API nur auf Ihrem Rechner.
Wenn die Schaltfläche Create grau bleibt, lesen Sie den Kasten: Er sagt, was fehlt. Meldet er, dass der Ordner nicht existiert, haben Sie Schritt 3 übersprungen.
- Klicken Sie auf Create.
Visual FoxPro arbeitet ein paar Sekunden und öffnet Ihnen den Project Manager des Projekts Almacen, wie bei jedem anderen Projekt von Ihnen.

Das hat er in C:\proyectos\Almacen\ angelegt. Es ist die Ausgabe von tree /f, einem Windows-Befehl, der einen Ordner mit seinem gesamten Inhalt zeichnet; Sie können es selbst in einem Fenster der Eingabeaufforderung ansehen:

| Ordner oder Datei | Was es ist |
|---|---|
Almacen.pjx | Ihr Projekt, wie immer |
build\ | Hier entsteht die DLL, und hier liegt Almacen.json, die Serverkonfiguration: Port, Sicherheit, Logs |
logs\ | Die Logs des Servers, eines pro Tag. Leer, bis Sie ihn starten |
src\controllers\ | Hier kommen Ihre Klassen mit Endpunkten hin |
src\core\ und src\lib\ | Die FoxServer-Engine und die JSON-Bibliothek. Nicht anfassen |
src\hooks\ | Die Klasse, die beim Kompilieren läuft und Ihre Routen einträgt |
src\utils\ | PreBuild.prg und PostBuild.prg, falls Sie vor oder nach dem Kompilieren etwas tun wollen |
In src\controllers\ liegt ein DemoController.prg mit sieben Beispiel-Endpunkten (hello, users, search…). FoxForge legt ihn an, damit das Projekt vom ersten Moment an etwas ausliefert. Er gehört nicht zu Ihrem Code: Wenn Sie mit diesem Tutorial fertig sind, entfernen Sie ihn aus dem Projekt und kompilieren neu, dann verschwinden seine Routen.
Schritt 5. Der Controller für die Artikel
Ein Controller ist eine VFP-Klasse mit Endpunkten darin. Wir legen einen für die Artikel des Lagers an. Auch hier bleiben die Namen spanisch, wie in den Screenshots: der Controller Articulos und die Tabelle articulos („Artikel“), die Felder codigo („Code“) und descripcion („Bezeichnung“) und die Routen /articulos.
- Öffnen Sie im Project Manager den Reiter Code, wählen Sie Programs und klicken Sie auf New….
- Es öffnet sich ein leerer Programmeditor. Fügen Sie diesen Code vollständig ein:
*-- Articulos.prg: der Controller des Tutorials.
*-- Jede PROCEDURE mit ihrer HELP-Klausel ist ein Endpunkt.
DEFINE CLASS Articulos AS ApiController OLEPUBLIC
*-- Läuft VOR jeder Anfrage: öffnet die Tabelle.
FUNCTION BeforeEndpoint(req, res)
SET DELETED ON
SET EXCLUSIVE OFF
USE articulos IN 0 SHARED AGAIN
ENDFUNC
*-- Läuft NACH jeder Anfrage: schließt alles.
PROCEDURE AfterEndpoint(req, res)
CLOSE DATABASES ALL
ENDPROC
*-- GET /articulos: die ganze Tabelle als JSON.
PROCEDURE pArticulos(req, res) HELP "GET: articulos public as articulos.lista"
LOCAL lcJson
SELECT codigo, descripcion, precio, stock ;
FROM articulos ;
WHERE activo ;
ORDER BY descripcion ;
INTO CURSOR art
lcJson = THIS.TableToJson("art")
USE IN SELECT("art")
RETURN THIS.OkRaw(lcJson)
ENDPROC
*-- GET /articulos/A001: ein Artikel nach seinem Code.
PROCEDURE pArticulo(req, res) HELP "GET: articulos/{codigo} public as articulos.uno"
LOCAL lcCodigo, loArt
lcCodigo = req.GetParam("codigo", "")
IF EMPTY(lcCodigo)
RETURN THIS.BadRequest("Falta el código del artículo")
ENDIF
SELECT articulos
LOCATE FOR ALLTRIM(articulos.codigo) == ALLTRIM(lcCodigo)
IF !FOUND()
RETURN THIS.NotFound("No existe el artículo " + lcCodigo)
ENDIF
loArt = THIS.NewObject("codigo,descripcion,precio,stock")
loArt.codigo = ALLTRIM(articulos.codigo)
loArt.descripcion = ALLTRIM(articulos.descripcion)
loArt.precio = articulos.precio
loArt.stock = articulos.stock
RETURN THIS.Ok(loArt)
ENDPROC
*-- POST /articulos: einen Artikel anlegen.
PROCEDURE pAlta(req, res) HELP "POST: articulos public as articulos.alta"
LOCAL loDatos, loNuevo, lcDesc
loDatos = req.json
IF ISNULL(loDatos) OR VARTYPE(loDatos) != "O"
RETURN THIS.BadRequest("El cuerpo tiene que ser un objeto JSON", "cuerpo_invalido")
ENDIF
lcDesc = ""
TRY
lcDesc = ALLTRIM(TRANSFORM(loDatos.descripcion))
CATCH
lcDesc = ""
ENDTRY
IF EMPTY(lcDesc)
RETURN THIS.BadRequest("Falta la descripción", "falta_descripcion")
ENDIF
loNuevo = THIS.NewObject("codigo,descripcion")
loNuevo.codigo = THIS.NewGuid()
loNuevo.descripcion = lcDesc
INSERT INTO articulos (codigo, descripcion, activo) ;
VALUES (loNuevo.codigo, loNuevo.descripcion, .T.)
RETURN THIS.Created(loNuevo)
ENDPROC
ENDDEFINEDie Meldungen in den Zeichenketten bleiben spanisch, weil sie genau so in den Screenshots der Antworten erscheinen.
- Speichern Sie mit File › Save (oder Strg+S). Er fragt Sie, wohin, und Vorsicht: Der Dialog öffnet sich nicht im Projektordner, sondern im letzten Ordner, in dem Visual FoxPro war: dem Ordner
ide\von FoxServer, wenn Sie dasCDaus Schritt 1 gemacht haben. Am schnellsten kommen Sie so hin: Schreiben SieC:\proyectos\Almacen\src\controllersin das Feld für den Dateinamen und drücken Sie die Eingabetaste, das bringt Sie in diesen Ordner. Schreiben Sie dannArticulos.prgund klicken Sie auf Speichern.

- Schließen Sie den Editor. Im Project Manager muss unter Code › Programs jetzt
articuloserscheinen.

Wenn er nicht in der Liste erscheint, wurde die Datei gespeichert, aber nicht ins Projekt aufgenommen, und für den Server existiert sie nicht. Wählen Sie Programs, klicken Sie auf Add… und wählen Sie
src\controllers\Articulos.prg.
Was jeder Teil tut
Lesen Sie ihn in Ruhe, es ist altbekanntes VFP:
DEFINE CLASS Articulos AS ApiController OLEPUBLIC. Ihre Klasse erbt vonApiController, und dort lebt alles mitTHIS., was Sie darin verwenden.OLEPUBLICist das altbekannte Schlüsselwort, damit eine Klasse von außerhalb von VFP verwendet werden kann.- Die
HELP-Klausel liest sich so:"<VERB>: <route> [public] [as <name>]".- Das Verb ist die HTTP-Methode:
GETzum Abfragen undPOSTzum Anlegen. - Die Route ist das, was in der Adresse hinter dem Port steht.
{codigo}ist ein variables Stück: Inarticulos/A001hatcodigoden WertA001. publicbedeutet, dass für den Aufruf kein Token nötig ist. Ohne, und wenn Sie die Authentifizierung aktivieren, wird eines verlangt.as articulos.listaist der Name des Endpunkts. Geben Sie ihn immer an: Sonst erfindet FoxServer einen aus der Route, und zweiGET-Endpunkte aufarticulosbekommen am Ende denselben Namen und eine[ERROR]-Zeile im Serverfenster.- Die
HELP-Klausel darf 255 Zeichen nicht überschreiten. Bei 256 kompiliert VFP nicht, und die Fehlermeldung erwähnt die Länge mit keinem Wort.
- Das Verb ist die HTTP-Methode:
BeforeEndpointundAfterEndpointlaufen vor und nach jeder Anfrage. Hat Ihre Anwendung eine Startroutine, dieSETs und Pfade einstellt, gehört sie hierher.TableToJson("art")verwandelt einen ganzen Cursor mit einem einzigen Aufruf in JSON. Das ist die Funktion, die neunzig Prozent der Arbeit einer Abfrage-API erspart.OkRawund nichtOkinpArticulos, weilTableToJson()bereits JSON liefert: Geben Sie es anOk(), wird es ein zweites Mal umgewandelt und kommt als Text voller Backslashes an. Und umgekehrt:Ok()mit einer Zeichenkette wandelt nichts um und liefert{}. Übergeben Sie immer ein Objekt.- Achten Sie auf den Alias in
pArticulo: Gesucht wird inarticulos, der Tabelle, dieBeforeEndpointöffnet, und nicht im Cursorart. Dieser Cursor entsteht und stirbt innerhalb vonpArticulos. Ihn hier zu verwenden, liefert den Fehler „No se encuentra el alias ‘ART’“ (Alias nicht gefunden; die Meldung stammt von VFP selbst, und meines spricht Spanisch), einer dieser Fehler, die eine Weile kosten, weil der Code sich einwandfrei liest. reqist die eingehende Anfrage:req.GetParam("codigo", "")für die Stücke der Route,req.GetQuery("q", "")für das, was hinter dem?steht,req.jsonfür den bereits in ein Objekt umgewandelten Body. Das zweite Argument ist der Standardwert; ohne ihn merken Sie spät, dass der Wert fehlte.- Validieren Sie immer, was hereinkommt: Was über das Netz ankommt, hat nicht Ihr Formular geschrieben. Und verwenden Sie
PEMSTATUS()nicht aufreq.json, um zu prüfen, ob ein Feld vorhanden ist, denn auf dem Prüfstand scheitert es. Der direkte Zugriff in einemTRY, wie inpAlta, funktioniert immer. - Was Sie zurückgeben, sind HTTP-Statuscodes, und jeder hat seine Funktion:
Ok(200),OkRaw(200),Created(201),NoContent(204),BadRequest(400),Unauthorized(401),Forbidden(403),NotFound(404) undFail(status, meldung, code)für alles andere. Die vollständige Liste steht in der Referenz.
Schritt 6. Die Beispieltabelle
Wir legen die Tabelle articulos mit zwei Datensätzen zum Ausprobieren an. Wenn Sie schon Ihre eigene haben, steht im Kasten unten, wo sie liegen muss.
Schreiben Sie diese Zeilen ins Befehlsfenster, eine nach der anderen, und drücken Sie nach jeder die Eingabetaste:
CD C:\proyectos\Almacen\build
CREATE DATABASE almacendata
CREATE TABLE articulos (codigo C(32), descripcion C(60), precio N(10,2), stock N(10,0), activo L)
INSERT INTO articulos VALUES ("A001", "Tornillo M6", 0.42, 1200, .T.)
INSERT INTO articulos VALUES ("A002", "Arandela M6", 0.11, 3400, .T.)
CLOSE DATABASES ALL
Drei Details dieser Zeilen, und keines ist eine Laune:
- Die Tabelle liegt in
build\. Der Server sucht einUSE articulosohne Pfad im Ordner der DLL. Wenn Ihre Tabelle schon an anderer Stelle existiert, öffnen Sie sie inBeforeEndpointmit vollem Pfad oder setzen Sie dort einSET PATH. - Sie liegt in einer Datenbank.
descripcionhat elf Buchstaben, und eine freie Tabelle akzeptiert keine Feldnamen mit mehr als zehn. Sie würde mit Fehler 1712 antworten, der von doppelten Namen spricht und die Länge mit keinem Wort erwähnt. UndcodigoistC(32), weil der Code, denNewGuid()beim Anlegen erzeugt, so lang ist. CLOSE DATABASES ALLam Ende ist Pflicht. Die IDE öffnet Tabellen exklusiv (SET EXCLUSIVE ONist die Voreinstellung), und solange Sie die Tabelle hier geöffnet haben, kann der Server sie nicht verwenden. Ohne diese Zeile sehen Sie in Schritt 9 einen Fehler 1705. Ich zeige ihn dort, damit Sie ihn wiedererkennen.
Schritt 7. Kompilieren
Kompiliert wird wie immer: mit der Schaltfläche Build… des Project Managers. Es gibt ein einziges Detail, das anders ist als bei Ihren üblichen Projekten, und das ist der Ordner, in dem die DLL gespeichert wird. Lesen Sie es, bevor Sie irgendetwas anklicken.
- Klicken Sie im Project Manager von
Almacenauf Build…. - Aktivieren Sie in Build Options die Optionen Multi-threaded COM server (dll) und Recompile All Files und klicken Sie auf OK.

- Visual FoxPro fragt, wo die DLL gespeichert werden soll, und schlägt
almacen.dllim Projektordner vor. Nehmen Sie diesen Ordner nicht. Doppelklicken Sie auf den Ordnerbuild, um hineinzugehen, lassen Sie den Namenalmacen.dllstehen und klicken Sie auf Speichern.

Wenn Sie die DLL versehentlich im Projektordner speichern. Visual FoxPro beschwert sich nicht: Es kompiliert, und der Server startet und lädt Ihre drei Endpunkte, als wäre nichts. Der Fehler zeigt sich bei der ersten Anfrage, mit einem Fehler 500, der sagt (die Meldung stammt von VFP und bedeutet, dass die Datei nicht existiert):
El archivo 'c:\proyectos\almacen\articulos.dbf' no existe.
Warum das passiert: Der Server sucht die Tabellen in dem Ordner, in dem die DLL liegt, und die Tabelle articulos liegt in build\. Wie man es behebt: Kompilieren Sie noch einmal mit Build…, gehen Sie diesmal beim Speichern in den Ordner build und starten Sie den Server neu (Schritt 8). Die DLL, die lose in C:\proyectos\Almacen\ liegen geblieben ist, können Sie löschen.
Visual FoxPro merkt sich den Ordner nicht: Es schlägt Ihnen bei jedem Kompilieren den Projektordner vor, dieser Hinweis gilt also für immer.
- Wenn Sie schon einmal kompiliert haben, fragt Windows, ob Sie
almacen.DLLersetzen wollen. Antworten Sie mit Ja.

Das dauert ein paar Sekunden. Während des Kompilierens liest FoxForge alle HELP-Klauseln und trägt Ihre Routen in die Serverkonfiguration ein: In diesem Moment beginnen Ihre Endpunkte zu existieren. Wenn kein Fehlerfenster erscheint, ist alles kompiliert.
Wenn ein Fehlerfenster erscheint, ist es ein VFP-Fehler in Ihrem Code, mit Datei und Zeile, wie bei jedem Projekt. Korrigieren Sie ihn und kompilieren Sie noch einmal. Am häufigsten beim Einfügen: ein verlorenes Anführungszeichen in einer
HELP-Klausel.
Wenn nach dem Kompilieren dieses Fenster erscheint, haben Sie Visual FoxPro ohne Administratorrechte geöffnet:

„Access to system Registry denied“ bedeutet, dass die DLL nur halb fertig ist. Visual FoxPro kompiliert, kann sie am Ende aber nicht in Windows registrieren und lässt sie unvollständig zurück: Sie ist etwa 24 KB groß statt über 200 KB, und der Server kann sie nicht verwenden. Klicken Sie auf OK, schließen Sie Visual FoxPro, öffnen Sie es wieder als Administrator (Schritt 1) und kompilieren Sie erneut.
Bequemer: FoxForge kompilieren lassen. Bei geöffnetem Projekt FoxForge › Current project › Build the DLL into build\ oder Strg+F7 von überall in der IDE. Das tut dasselbe wie die Schaltfläche Build…, aber ohne Rückfragen: Es kompiliert alles neu, legt die DLL mit dem Projektnamen in build\ ab und startet den Server neu, falls er lief. So gibt es keinen Ordner, den man verwechseln kann.

Wenn Sie diese Optionen unter Current project nicht sehen, haben Sie das Projekt nach dem Laden von FoxForge geöffnet: Klicken Sie auf FoxForge › Refresh menu.
Schritt 8. Den Server starten
Der Server ist ein eigenes Programm, FoxServer.Host.exe, das Ihre DLL lädt und die Anfragen bedient. Starten Sie ihn aus dem Menü: FoxForge › Current project › Start the server (dasselbe Bild wie in Schritt 7). FoxForge weiß, wo FoxServer installiert ist und wo die Konfiguration Ihres Projekts liegt.
Lieber das Befehlsfenster? Diese Zeile tut dasselbe.
RUN /Nöffnet ein Programm, ohne auf sein Ende zu warten, und--configsagt dem Server, in welchem Ordner die Konfiguration Ihres Projekts liegt. Wenn Sie FoxServer in einen anderen Ordner installiert haben, ersetzen Sie den ersten Pfad durch den Ordnerbin\Ihrer Installation.
RUN /N "C:\Program Files (x86)\FoxServer\bin\FoxServer.Host.exe" --config C:\proyectos\Almacen\buildEs öffnet sich ein schwarzes Fenster: Das ist der Server. Nach ein paar Sekunden muss es mit diesen Zeilen enden:
Listening: http://127.0.0.1:8099/
Server : Almacen [api] - C:\proyectos\Almacen\build\almacen.DLL
Press Ctrl+C to stop.Etwas weiter oben sehen Sie Ihre beiden geladenen Controller: DemoController mit 7 endpoint(s) loaded und Articulos mit 3 endpoint(s) loaded.

Lassen Sie dieses Fenster offen, solange Sie testen: Wenn Sie es schließen, geht die API aus. Jede eingehende Anfrage hinterlässt dort ein paar Zeilen, und dort schauen Sie nach, wenn etwas nicht funktioniert. Um den Server anzuhalten, drücken Sie darin Strg+C oder schließen es.
Schritt 9. Im Browser testen
Öffnen Sie Ihren Browser und schreiben Sie diese Adresse in die Adressleiste, als wäre es eine Webseite:
http://127.0.0.1:8099/articulosSie müssen Ihre Tabelle als JSON sehen, nach Bezeichnung sortiert, „Arandela“ (Unterlegscheibe) vor „Tornillo“ (Schraube), wie es die Abfrage verlangt:
[{
"codigo": "A002",
"descripcion": "Arandela M6",
"precio": 0.11,
"stock": 3400
},{
"codigo": "A001",
"descripcion": "Tornillo M6",
"precio": 0.42,
"stock": 1200
}]
Jetzt ein einzelner, nach seinem Code:
http://127.0.0.1:8099/articulos/A001{
"codigo": "A001",
"descripcion": "Tornillo M6",
"precio": 0.42,
"stock": 1200
}
Und einer, den es nicht gibt, um das NotFound aus dem Code zu sehen:
http://127.0.0.1:8099/articulos/ZZZZ{
"type": "about:blank",
"title": "Not Found",
"status": 404,
"detail": "No existe el artículo ZZZZ",
"instance": "/articulos/ZZZZ",
"code": "not_found"
}
Dieses Format ist Problem Details, RFC 9457: die Standardform, einen Fehler in einer API zu beschreiben, die die Programme, die sie aufrufen werden, bereits verstehen. Das detail ist Ihre Meldung, genau so, wie Sie sie in THIS.NotFound(...) geschrieben haben. Erfolgreiche Antworten tragen diesen Umschlag nicht: Sie kommen so heraus, wie Sie sie oben gesehen haben.
Wenn Sie stattdessen ein 500 mit „1705“ sehen
Der Wortlaut stammt von VFP selbst und erscheint daher in der Sprache Ihres VFP; meines spricht Spanisch:
{
"type": "about:blank",
"title": "Internal Server Error",
"status": 500,
"detail": "Internal server error: Error: .beforeendpoint c:\\proyectos\\almacen\\build\\src\\controllers\\articulos.prg Error en la línea 9 Denegado c:\\proyectos\\almacen\\build\\articulos.dbf al acceso al archivo. 1705, Error Code: 1705",
"instance": "/articulos"
}
Das ist die Tabelle, die in Ihrem Visual FoxPro noch geöffnet ist: Sie haben das CLOSE DATABASES ALL aus Schritt 6 übersprungen. Schreiben Sie es jetzt ins Befehlsfenster und laden Sie die Seite neu, ohne den Server anzufassen.
Schritt 10. Einen Artikel aus Visual FoxPro anlegen
Ein Browser kann nur mit GET anfragen. Zum Anlegen braucht es ein POST mit dem Artikel darin, und das machen wir direkt aus Visual FoxPro mit dem Windows-Objekt ServerXMLHTTP, demselben, mit dem viele von Ihnen bereits Webdienste aufrufen. Schreiben Sie diese Zeilen ins Befehlsfenster, eine nach der anderen:
oHttp = CREATEOBJECT("MSXML2.ServerXMLHTTP.6.0")
oHttp.Open("POST", "http://127.0.0.1:8099/articulos", .F.)
oHttp.SetRequestHeader("Content-Type", "application/json")
oHttp.Send('{"descripcion":"Arandela M8"}')
? oHttp.Status
? oHttp.ResponseTextIm Hauptfenster von Visual FoxPro müssen ein 201 erscheinen, also „angelegt“, und der neue Artikel mit seinem Code:
201
{
"codigo": "4241c943794c45ccac61dd4af6361c44",
"descripcion": "Arandela M8"
}
Ihr Code wird ein anderer sein: Es ist eine eindeutige Kennung, die bei jedem Anlegen neu erzeugt wird. Gehen Sie zurück in den Browser, laden Sie http://127.0.0.1:8099/articulos neu, und da ist er, mit Preis und Bestand auf null, weil wir nur die Bezeichnung geschickt haben.
Schritt 11. Etwas ändern und neu kompilieren
So wird Ihr Alltag aussehen: Sie ändern den Code, kompilieren und testen. Es gibt ein Detail, das man von Anfang an kennen sollte.
Beim Kompilieren hält der Server an. Die DLL ist in Gebrauch, solange der Server sie geladen hat, und Windows lässt nicht zu, dass sie überschrieben wird. FoxForge hält ihn vor dem Kompilieren für Sie an, und das schwarze Fenster schließt sich von selbst.
Der Zyklus ist also:
- Ändern Sie in
Articulos.prg, was Sie wollen, und speichern Sie. - Drücken Sie Strg+F7 (oder FoxForge › Current project › Build the DLL into
build\). Es kompiliert und startet den Server von selbst neu. - Laden Sie den Browser neu.
Wenn Sie mit der Schaltfläche Build… kompilieren, kommt der Server nicht von selbst zurück: Gehen Sie beim Speichern in den Ordner build, antworten Sie beim Ersetzen mit Ja und starten Sie ihn erneut mit FoxForge › Current project › Start the server oder mit der Zeile RUN /N aus Schritt 8 (gehen Sie im Befehlsfenster mit der Pfeiltaste bis zu ihr hoch und drücken Sie die Eingabetaste).

Wenn Sie einen Endpunkt hinzufügen und der Browser ein 404 liefert, fehlt dieser Zyklus. Denken Sie an die drei Dinge vom Anfang: Die Route existiert erst, wenn Sie kompilieren.
Wenn etwas nicht klappt
| Was Sie sehen | Was passiert | Was zu tun ist |
|---|---|---|
| Die Schaltfläche Create des Assistenten bleibt grau | Eine Angabe fehlt, oder der Ordner existiert nicht | Lesen Sie den Kasten unten im Assistenten; meldet er, dass der Ordner nicht existiert, gehen Sie zurück zu Schritt 3 |
| Beim Kompilieren „Access to system Registry denied“ | Visual FoxPro ist nicht als Administrator geöffnet, und die DLL ist nur halb fertig | Schließen Sie es, öffnen Sie es als Administrator (Schritt 1) und kompilieren Sie erneut |
| Das schwarze Serverfenster öffnet sich und schließt sich sofort | Er findet die Konfiguration nicht, oder es gibt keine DLL | Starten Sie ihn über FoxForge › Current project › Start the server; bei RUN /N prüfen Sie, ob der Pfad bei --config C:\proyectos\Almacen\build lautet. Und ob Schritt 7 ohne Fehler endete |
| Der Browser meldet, dass er keine Verbindung herstellen kann | Der Server läuft nicht | Prüfen Sie, ob das schwarze Fenster noch offen ist; wenn nicht, wiederholen Sie Schritt 8 |
| Unter Current project erscheinen weder Build noch Start the server | Sie haben das Projekt nach dem Laden von FoxForge geöffnet | FoxForge › Refresh menu |
| 404 auf einer Route, die Sie gerade geschrieben haben | Sie haben seit dem Hinzufügen nicht kompiliert | Schritt 11 |
500 mit „El archivo c:\proyectos\almacen\articulos.dbf no existe“ | Sie haben die DLL im Projektordner gespeichert und nicht in build\ | Kompilieren Sie mit Strg+F7, das legt sie an die richtige Stelle, oder mit Build… und gehen Sie beim Speichern in den Ordner build |
| 500 mit 1705 | Die Tabelle ist in Ihrem Visual FoxPro geöffnet | CLOSE DATABASES ALL im Befehlsfenster |
| 500 mit „No se encuentra el alias“ | Sie verwenden einen Alias, der in diesem Endpunkt nicht existiert | Lesen Sie den Hinweis zum Alias in Schritt 5 |
| 403 beim Aufruf von einem anderen Rechner | Es liegt an der Lizenz, nicht an Ihrem Code | Lesen Sie den Absatz unten |
Ein Detail für den Moment, in dem andere Rechner Sie aufrufen sollen. Das Projekt entsteht so, dass es nur auf 127.0.0.1 antwortet, von außen kommt also nicht einmal eine Verbindung zustande: Das ist nicht die Lizenz, das ist die Konfiguration (host in build\Almacen.json). Wenn Sie es auf die IP Ihres Rechners ändern, sehen Sie das Zweite: Bekommen Sie statt 200 ein 403, liegt es nicht an Ihrem Endpunkt, sondern an der Lizenz. Eine Developer-Lizenz nimmt nur Anfragen vom eigenen Rechner an. Um andere zu bedienen, braucht es eine Runtime-Lizenz, die auf dem Server des Kunden installiert wird. In der Entwicklung brauchen Sie sie nicht.
Was Sie getan haben, und was nicht
Sie haben eine Tabelle Ihrer Anwendung als REST-API mit drei Endpunkten veröffentlicht, ohne die IDE zu verlassen, ohne die Logik neu zu schreiben, ohne die Sprache zu wechseln und ohne ein Framework dazwischen. Alles, was Sie geschrieben haben, ist VFP.
Was Sie noch nicht getan haben, ist, sie in Produktion zu bringen: HTTPS-Zertifikat, dass der Server von selbst als Windows-Dienst startet, die Logs und wie man eine neue Version ausrollt, ohne den Server herunterzufahren. Das ist das nächste Tutorial, denn dort bleiben die Leute, die bereits laufende Systeme haben, am häufigsten hängen. Bis dahin erklärt es die FoxServer-Dokumentation Stück für Stück.
Mögen Sie die Kommandozeile? Es gibt dieses Tutorial auch als CLI-Version, mit denselben Schritten als Befehle, die man einfügen und wiederholen kann.
Wenn hier etwas nicht so funktioniert, wie es geschrieben steht, schreiben Sie an soporte@irwinrodriguez.dev, mit dem, was Sie auf dem Bildschirm sehen. Jede Ausgabe in diesem Artikel ist aus einem echten Lauf kopiert, und wenn Ihre anders aussieht, möchte ich es wissen.