IR
irwinrodriguez.dev
Zuruck zur Dokumentation

API-Referenz

Vollstandige Referenz aller offentlichen Klassen, Methoden und Eigenschaften von FoxServer.

ApiController

Basisklasse, von der alle Controller erben mussen. Bietet Zugang zu JSON-Dienstprogrammen, JWT-Generierung, Protokollierung und dem Endpunkt-Lebenszyklus.

Antwortmethoden

Eigenschaft / MethodeTypBeschreibung
newObject(fields)ObjectErstellt ein dynamisches VFP-Objekt. fields ist eine kommagetrennte Namensliste.
ToJson(obj)StringSerialisiert ein VFP-Objekt in einen JSON-String.
FromJson(json)ObjectDeserialisiert einen JSON-String in ein VFP-Objekt.
GenerateJWT(user)StringGeneriert einen signierten JWT-Token fur den angegebenen Benutzer.
GetUserIdFromToken(req)StringExtrahiert die Benutzer-ID aus dem JWT-Token der Anfrage.
LogInfo(msg)VoidSchreibt eine INFO-Nachricht in das Serverprotokoll.
LogError(msg)VoidSchreibt eine ERROR-Nachricht in das Serverprotokoll.
QueueWebhook(url, secret, evt)VoidStellt ein Webhook-Ereignis fur asynchrone Zustellung in die Warteschlange.
GetServerMetrics()ObjectGibt das Server-Metriken-Objekt zuruck (Uptime, Anfragen, Speicher...).

Lebenszyklus-Hooks

Eigenschaft / MethodeTypBeschreibung
BeforeEndpoint(req, res)BooleanWird vor jedem Endpunkt ausgefuhrt. .F. zuruckgeben bricht die Anfrage ab.
AfterEndpoint(req, res)VoidWird nach jedem Endpunkt ausgefuhrt. Fur die Ressourcenbereinigung.
BeforeRequest(req, res)BooleanHook auf Projektebene. Vor jeglichem Routing.
AfterResponse(req, res)VoidHook auf Projektebene. Nach dem Senden der Antwort.

FoxServerRequest

Objekt, das alle Informationen der eingehenden HTTP-Anfrage kapselt. Als Parameter req in allen Endpunkten verfugbar.

Eigenschaften

Eigenschaft / MethodeTypBeschreibung
methodStringGET, POST, PUT, PATCH, DELETE, HEAD
urlUriVollstandige Anfrage-URL als Uri-Objekt
pathStringPfad ohne Query-String. Z.B.: /api/v1/products
paramsObjectURL-Parameter. Z.B.: params.id aus Route /{id}
queryObjectQuery-String-Parameter. Z.B.: query.page aus ?page=2
headersDictionaryHTTP-Header. Zugriff ohne Beachtung der Gro-/Kleinschreibung. Z.B.: headers.Authorization
bodyStringAnfrage-Body als Klartext (raw)
jsonObjectGeparster JSON-Body. Nur verfugbar wenn Content-Type: application/json
contentTypeStringWert des Content-Type-Headers
remoteIPStringIP-Adresse des Clients
schemeString"http" oder "https"

Methoden

* Get URL param with fallback
lcId = req.GetParam("id", "")

* Check if a header was sent
IF req.HasHeader("X-Api-Key")
    lcKey = req.headers["X-Api-Key"]
ENDIF

* Safe JSON access (check before reading nested)
IF !ISNULL(req.json) AND !ISNULL(req.json.address)
    lcCity = req.json.address.city
ENDIF

FoxServerResponse

Objekt zum Erstellen und Senden der HTTP-Antwort. Als Parameter res in allen Endpunkten verfugbar. Alle Methoden sind verkettbar (geben res zuruck).

Eigenschaft / MethodeBeschreibung
status(code)Setzt den HTTP-Statuscode (200, 201, 400, 401, 404, 500...)
json(jsonStr)Sendet JSON-Body. Setzt Content-Type: application/json automatisch.
send(text)Sendet Klartext oder HTML als Body.
header(key, value)Fugt einen Antwort-Header hinzu oder uberschreibt ihn. Verkettbar.
location(url)Setzt den Location-Header. Mit status(301) oder status(302) fur Weiterleitung verwenden.
sendFile(path, disp)Sendet eine Datei. disp kann "inline" (im Browser anzeigen) oder "attachment" (Download erzwingen) sein.

Beispiel

* Standard success response
res.status(200).json(THIS.ToJson(loResult))

* Created with location header
res.status(201)
   .header("Location", "/api/v1/users/" + lcNewId)
   .json(THIS.ToJson(loResult))

* Error response
res.status(400).json('{"error":"Name is required"}')

* File download
res.status(200)
   .header("Content-Disposition", 'attachment; filename="report.pdf"')
   .sendFile("C:\reports\report.pdf", "attachment")

ApiController — Detaillierte Methoden

Objekt- und JSON-Verwaltung

Eigenschaft / MethodeBeschreibung
NewObject(fields) Erstellt ein VFP-Objekt mit auf NULL initialisierten Eigenschaften. fields ist eine kommagetrennte Liste: "status,data,message".
NewObjectFromCursor(cursor, session) Erstellt ein VFP-Objekt mit der Struktur eines Cursors. Nutzlich fur Vorlagen auf Basis von Tabellenstrukturen.
ToJson(obj) Serialisiert ein VFP-Objekt via JSONFox in einen JSON-String.
ParseJson(jsonStr) Deserialisiert einen JSON-String in ein VFP-Objekt via JSONFox.
TableToJson(cursor, currentRow) Konvertiert einen Cursor in JSON. currentRow=.T. gibt den aktuellen Datensatz als Objekt zuruck; .F. gibt alle als Array.
TableToJsonObject(cursor, currentRow, session) Wie TableToJson, gibt aber eine VFP-Objektkollektion statt eines JSON-Strings zuruck.
MasterToJSON(master, detail, expr, attr) Generiert hierarchisches Master-Detail-JSON. expr ist die Join-Bedingung, attr der Name des Detail-Arrays im JSON.
* Ejemplo: maestro-detalle con MasterToJSON
SELECT id, fecha, cliente FROM pedidos INTO CURSOR curPedidos
SELECT id, pedido_id, producto, cantidad FROM lineas INTO CURSOR curLineas
lcJson = THIS.MasterToJSON("curPedidos", "curLineas", "curPedidos.id = curLineas.pedido_id", "lineas")
res.status(200).json(lcJson)

Text- und Formatierungshilfsprogramme

Eigenschaft / MethodeBeschreibung
Format(template, p0..p10) Ersetzt Platzhalter {0}, {1}, ... im Template. Ahnlich wie String.Format in C#.
EscapeCharsToJSON(text) Maskiert Sonderzeichen fur die sichere Verwendung in JSON.
EscapeCharsToHTML(text) Maskiert Sonderzeichen fur die Verwendung in HTML.
Content(req, source) Serialisiert source in das Format, das der Client uber Accept-Header oder ?format= anfordert (json, xml, csv).
TableToXml(cursor, currentRow) Konvertiert einen Cursor in XML.
TableToCsv(cursor, currentRow) Konvertiert einen Cursor in CSV.

Datum-, Codierungs- und ID-Dienstprogramme

Eigenschaft / MethodeTypBeschreibung
NewGuid() String Generiert eine GUID ohne geschweifte Klammern oder Bindestriche. Fur alle PKs verwenden.
DTOUNX(dt, useMsec) Number Konvertiert einen VFP-DateTime in einen Unix-Zeitstempel. useMsec=.T. gibt Millisekunden zuruck.
UNXTOD(timestamp) DateTime Konvertiert einen Unix-Zeitstempel (Sekunden oder Millisekunden) in einen VFP-DateTime.
Base64URLEncode(input) String Codiert in Base64URL (wird in JWT und sicheren URLs verwendet).
Base64URLDecode(input) String Decodiert von Base64URL.
* Conversiones de fecha
lnTs = THIS.DTOUNX(DATETIME(), .F.)   && segundos
ldFecha = THIS.UNXTOD(1716825600)

* Identificadores
lcId = THIS.NewGuid()   && "a1b2c3d4e5f647g8h9i0j1k2l3m4n5o6"

* Formato de mensajes
lcMsg = THIS.Format("Usuario {0} accedio a {1} desde {2}", lcUser, lcUrl, lcIp)

Lebenszyklus und Ressourcen

Eigenschaft / MethodeBeschreibung
Initialize() Wird beim Erstellen einer Instanz automatisch ausgefuhrt. Konfiguriert cPath, ladt JSONFox und ApiService.
LoadJsonFox() Ladt JSONFox.app wenn noch nicht verfugbar. Wird intern von Initialize() aufgerufen.
GetGlobalResource(name) Ruft eine gemeinsame globale Ressource (Verbindungen, Konfigurationen) uber den Anwendungslebenszyklus ab.
SetWorkingDirectory(path) Setzt cPath und ruft Initialize() auf. Nutzlich fur Tests ausserhalb des FoxServer-Zyklus.
CleanUp() / Release() / Dispose() Gibt Ressourcen am Ende des Controller-Lebenszyklus frei. Werden automatisch von FoxServer aufgerufen.

FoxServerRequest — Detaillierte Methoden

Eigenschaft / MethodeBeschreibung
GetHeader(key, default) Gibt den Wert des angegebenen HTTP-Headers zuruck. Falls nicht vorhanden wird default zuruckgegeben.
GetParam(key, default) Gibt einen URL-Routenparameter zuruck (z.B. {id}). Gibt default zuruck wenn nicht vorhanden.
GetQuery(key, default) Gibt einen Query-String-Parameter zuruck (?key=value). Gibt default zuruck wenn nicht vorhanden.
GetQueryParams() Gibt alle Query-Parameter als FoxServerTupleDictionary zuruck.
HasJsonBody() .T. wenn die Anfrage einen gultig geparsten JSON-Body hat. Vor dem Zugriff auf req.json.* pruefen.
GetRawBody() Gibt den ungeparsten Anfrage-Body zuruck. Notwendig fur die Webhook-Signaturverifizierung.
GetFormField(key, default) Gibt den Wert eines Multipart- oder URL-kodierten Formularfeldes zuruck.
HasFormField(key) .T. wenn das Formularfeld in der Anfrage vorhanden ist.
File(field) Gibt das Objekt einer uber Multipart hochgeladenen Datei zuruck. Bietet FileName und SaveToFile(path).
Files(field) Gibt eine Kollektion von Dateien zuruck, die unter demselben Feldnamen hochgeladen wurden.
* Leer headers y params
lcToken = req.GetHeader("Authorization", "")
lcId    = req.GetParam("id", "")
lcPage  = req.GetQuery("page", "1")

* Verificar body antes de acceder
IF req.HasJsonBody()
    lcEmail = req.json.email
ELSE
    res.status(400).json('{"error":"JSON body required"}')
    RETURN
ENDIF

* Subir archivo
loFile = req.File("avatar")
IF !ISNULL(loFile)
    loFile.SaveToFile(THIS.cPath + "uploads\" + loFile.FileName)
ENDIF

* Webhook: raw body para HMAC
lcRaw = req.GetRawBody()
lcSig = req.GetHeader("X-Signature", "")

Kollektionen

FoxServerTupleDictionary

Schlussel-Wert-Worterbuch fur Headers, Params und Query. Zugriff ohne Beachtung der Gross-/Kleinschreibung.

Eigenschaft / MethodeBeschreibung
CountAnzahl der Eintrage.
GetKey(n)Schlussel an Position n (Basis 1).
GetValue(n)Wert an Position n.
Contains(key).T. wenn der Schlussel vorhanden ist.
GetValueByKey(key)Wert nach Schlusselnamen.
* Iterar todos los query params
loParams = req.GetQueryParams()
FOR lnI = 1 TO loParams.Count
    lcKey = loParams.GetKey(lnI)
    lcVal = loParams.GetValue(lnI)
    THIS.LogInfo(THIS.Format("Param {0}={1}", lcKey, lcVal))
ENDFOR

FoxServerTuple

Einfaches Schlussel-Wert-Paar. Interne Komponente von FoxServerTupleDictionary.

Eigenschaft / MethodeBeschreibung
KeyName des Schlussels.
ValueZugeordneter Wert.

Weiter: FAQ →