IR
irwinrodriguez.dev
Zurück zur Dokumentation

Schnellstart

Von null zu einem ausliefernden Endpunkt, in sieben Schritten. Jede Ausgabe hier ist aus einem echten Lauf kopiert, nicht aus dem Gedachtnis geschrieben. Gultig fur FoxServer 0.9.38.

Die CLI spricht heute Spanisch, ihre Ausgaben unten sind daher auf Spanisch. Die Befehle und die Exit-Codes sind in jeder Sprache dieselben.

Bevor Sie anfangen

  • Visual FoxPro 9 SP2. Es ist Ihr Code, der veröffentlicht wird: FoxServer übersetzt nichts.
  • FoxServer 0.9.38 installiert und lizenziert. Der Installer legt bin\ (den Host), cli\ (die Kommandozeile) und ide\ (die Werkstatt) ab. Siehe Installation.
  • Eine erhöhte Konsole, und nur für Schritt 4. Ohne sie endet dieser Befehl mit 17 und fasst nichts an.
  • curl, das Windows bereits mitbringt, oder ein beliebiger HTTP-Client.

Wenn Sie die CLI einer Installation benutzen, müssen Sie nichts konfigurieren: sie findet Werkstatt und Host, indem sie sich die eigenen Fusse ansieht (<Wurzel>\ide\providers\web und <Wurzel>\bin\), wo die Wurzel auch liegt. Bei einer einzelnen CLI setzen Sie FOXSERVER_TOOLING einmal.

Zwei Dinge, die man vorher verstanden haben sollte

Ihr Code bleibt Ihrer. Er wird nur veröffentlicht.

Eine PROCEDURE einer VFP-Klasse wird zu einem HTTP-Endpunkt, indem man eine HELP-Klausel deklariert. Es gibt kein Framework zu lernen und keine Architektur zu ändern.

pHola: eine PROCEDURE als Endpunkt veröffentlicht
PROCEDURE pHola(req, res) HELP "GET: hola public"
    RETURN THIS.Ok(THIS.NewObject("mensaje"))
ENDPROC

Die Route existiert nicht, bis Sie kompilieren.

Die Route entsteht in dieser HELP-Klausel und erreicht den Server erst, wenn der Hook sie beim Build extrahiert. Das ist die Ursache Nummer eins für "ich habe den Endpunkt hinzugefügt und bekomme 404". Wenn eine Route nicht auftaucht: es fehlt das Kompilieren.

1. Das Projekt anlegen

Die CLI liegt in cli\foxserver.exe der Installation. Dieser Befehl legt den Ordnerbaum, die .pjx und das Server-Manifest in build\ an.

foxserver init --name Almacen --path C:\proyectos\almacen --port 8099 --format json
{
  "created": true,
  "name": "Almacen",
  "path": "C:\\proyectos\\almacen\\"
}

Beachten Sie: das Manifest existiert bevor irgendetwas kompiliert wurde. Deshalb funktionieren die Abfragebefehle schon ab hier.

2. Einen Controller hinzufügen

Es schreibt die .prg und verknupft sie mit der .pjx. Es ist idempotent: bei einem vorhandenen endet es mit 0 und einer Warnung, ohne den Inhalt zu überschreiben.

foxserver controller-add --project C:\proyectos\almacen --name Articulos --format json
{
  "created": true,
  "controller": "Articulos",
  "file": "C:\\proyectos\\almacen\\src\\controllers\\Articulos.prg"
}

Wird die Datei erzeugt, aber nicht verknupft, endet es mit 14: ein Controller, der nicht im Projekt ist, existiert für den Server nicht.

3. Einen Endpunkt hinzufügen

Das schreibt in die Quelle eine Prozedur mit ihrer HELP-Klausel, und die erzeugt die Route. Öffnen Sie sie: darin ist eine VFP-Klasse, die von ApiController erbt.

foxserver endpoint-add --project C:\proyectos\almacen --controller Articulos `
                      --method get --route articulos --proc pArticulos --public --format json
{
  "created": true,
  "controller": "Articulos",
  "method": "GET",
  "route": "articulos",
  "proc": "pArticulos",
  "public": true
}
ArticulosController: was endpoint-add schreibt
DEFINE CLASS ArticulosController AS ApiController OLEPUBLIC

    PROCEDURE pArticulos(req, res) HELP "GET: articulos public"
        LOCAL loRes
        loRes = THIS.NewObject("status,data,message")
        loRes.status  = "ok"
        loRes.data    = NULL
        loRes.message = "ok"
        res.status(200).json(THIS.ToJson(loRes))
    ENDPROC

ENDDEFINE

Die HELP-Klausel liest sich so: "<VERB>: <Route> [public]". Mit public braucht der Endpunkt kein Token. Und eine Warnung, die einen Nachmittag spart: die HELP-Klausel darf 255 Zeichen nicht uberschreiten. Bei 256 kompiliert VFP nicht, und der Fehler erwahnt die Lange nirgends.

Hier verliert jeder den Faden. Starten Sie jetzt endpoint-list und Sie bekommen []. info sagt "endpoints": 0 und openapi sagt "paths": []. Es ist nicht kaputt: der Endpunkt lebt in der Quelle und erreicht das Manifest erst, wenn der Hook ihn beim Kompilieren extrahiert. Weiter zu Schritt 4.

4. Kompilieren - die einzige Wand

foxserver build --project C:\proyectos\almacen --format json

Aus einer normalen Konsole wird das nicht funktionieren, und das mit Absicht. Das kommt dabei heraus:

foxserver: hace falta una consola ELEVADA para compilar.

  BUILD MTDLL registra la coclase en COM al terminar, y sin
  permisos falla con el error 1640 dejando una DLL sin type
  library. Compila, pesa una decima parte y el motor no puede
  activar nada de ella.

  No se ha tocado nada. Abre una consola como administrador y
  repite el comando.

Exit 17, und es wurde nichts angefasst. Öffnen Sie PowerShell als Administrator und wiederholen Sie es. Eine Warnung build.register am Ende ist kein Fehler: die DLL ist kompiliert und der Exit-Code ist 0.

Jetzt existiert der Endpunkt für den Server:

foxserver endpoint-list --project C:\proyectos\almacen --format json

5. Ausliefern

Es startet und kehrt zurück und gibt Ihnen die pid. Es blockiert nicht, außer Sie übergeben --attach. Zum Stoppen beenden Sie diese PID.

foxserver serve --project C:\proyectos\almacen --format json

6. Ausprobieren

curl http://127.0.0.1:8099/articulos
Wenn Sie 403 statt 200 bekommen, liegt es nicht an Ihrem Endpunkt, sondern an der Lizenz. Eine Developer-Lizenz akzeptiert nur Anfragen von 127.0.0.1. Von einem anderen Rechner brauchen Sie eine Runtime-Lizenz.

7. Und wenn es Teil der Installation werden soll

serve liefert aus dem Projekt aus: es startet den Host mit Blick auf den Ordner build\ des Projekts und fasst nichts an der Installation an. Zum Testen gut, aber verify.cmd sieht diesen Server nicht und der Windows-Dienst startet ihn nicht, denn beide schauen in das config\servers\ der Wurzel.

foxserver deploy --project C:\proyectos\almacen
Desplegado Almacen en la instalacion:
  C:\Program Files\FoxServer\config\servers\ALMACEN.json
  clave: 127.0.0.1:8099:

Vor dem Schreiben wird geprüft, dass kein anderes Manifest denselben Schlüssel Host:Port:Präfix hat: gibt es eines, endet es mit 11 und nennt es, denn der Host wurde eines starten und das andere mit einer Warnung überspringen, die nur im Log sichtbar ist. --force überspringt die Prüfung.

Die Alternative ohne Kommandozeile. Alles Obige geht auch mit FoxForge, der Werkstatt, die der Installer in ide\ ablegt und die mit foxforge.cmd in der Visual-FoxPro-9-IDE geoffnet wird: Menu Neu › Webdienst / REST-API. Sie macht dasselbe wie init, controller-add und endpoint-add, mit Formularen statt Befehlen. Dazu gibt es ein Schritt-für-Schritt-Tutorial aus der IDE.

Prüfen, ohne etwas zu starten

Diese funktionieren ab Schritt 1, mit unkompiliertem Projekt:

foxserver doctor          --project C:\proyectos\almacen    # que le falta y por donde se expone
foxserver validate        --project C:\proyectos\almacen    # exit 11 si hay errores
foxserver info            --project C:\proyectos\almacen --format json
foxserver openapi         --project C:\proyectos\almacen    # el contrato, sin levantar el servidor
foxserver middleware-list --project C:\proyectos\almacen    # auth, logging, status, sse...

Wenn etwas schiefgeht

ExitWas passiert istWas zu tun ist
2Ein Pflichtargument fehlt, oder ein Aufzahlungswert ist ungültigfoxserver describe liefert das exakte Schema
10Es gibt kein Manifest in build\Dieser Ordner ist kein FoxServer-Projekt. Es heißt nicht "nicht kompiliert": das Manifest legt init an
11Das Projekt hat Validierungsfehlerfoxserver validate listet sie mit ihrer Schwere auf
12Das FoxForge-Tooling fehltDie CLI einer Installation benutzen, oder FOXSERVER_TOOLING setzen
13vfp9.exe nicht gefunden--vfp <Pfad> oder FOXSERVER_VFP
14Das Schreiben schlug fehlPrüfen, ob die .prg mit der .pjx verknupft wurde
16FoxServer.Host.exe nicht gefundenDie CLI einer Installation benutzen, oder --host <Pfad>
17build ohne erhöhte KonsoleEine als Administrator öffnen
18Die Kompilierung schlug fehlDie Fehler kommen auf stderr, mit Datei und Zeile, aus der .ERR von VFP. Gab es eine frühere MTDLL, steht sie noch: der Server wurde den alten Code ausliefern

Nächste Schritte