Erweiterte Funktionen
FoxServer enthalt erweiterte Funktionen fur moderne Anwendungsfalle: Echtzeit-Event-Streaming, Webhooks mit Wiederholungsversuchen, Hot-Reload von Controllern, Metriken und Windows-Dienstmodus.
Server-Sent Events (SSE)
SSE ermoglicht es dem Server, Ereignisse uber eine persistente HTTP-Verbindung an den Client zu pushen. Ideal fur Echtzeit-Benachrichtigungen, Fortschritt langer Operationen und Daten-Feeds.
In JSON aktivieren:
{ "middleware": { "sse": true } } Implementierung im Controller:
PROCEDURE GetLiveData(req, res) HELP "GET: stream/live public"
LOCAL i, lcData
res.header("Content-Type", "text/event-stream")
.header("Cache-Control", "no-cache")
.header("Connection", "keep-alive")
FOR i = 1 TO 20
lcData = '{"tick":' + TRANSFORM(i) + ',"ts":"' + DTOC(DATETIME()) + '"}'
res.send("data: " + lcData + CHR(13) + CHR(10) + CHR(13) + CHR(10))
INKEY(1) && 1-second pause between events
NEXT
ENDPROC JavaScript-Client:
const es = new EventSource('/api/stream/live');
es.onmessage = (e) => {
const data = JSON.parse(e.data);
console.log('tick', data.tick, 'at', data.ts);
};
es.onerror = () => es.close(); Webhook-System
FoxServer enthalt einen Webhook-Prozessor mit persistenter Warteschlange, automatischen Wiederholungsversuchen mit exponentiellem Backoff und HMAC-SHA256-Signierung.
- Persistente Warteschlange (uberlebt Server-Neustarts)
- Automatische Wiederholungsversuche mit konfigurierbarem exponentiellem Backoff
- Automatische HMAC-SHA256-Signierung bei jeder Lieferung
- Gleichzeitige Worker fur parallele Lieferungen
- Protokoll aller Lieferversuche
Konfiguration:
"middleware": {
"webhooks": {
"enabled": true,
"global": {
"retries": 3,
"timeout": 30,
"backoff": [5, 15, 30],
"queue": { "path": "queue/webhooks", "workers": 2 },
"logging": { "enabled": true, "path": "logs/webhooks/" }
}
}
} Einen Webhook aus einem Controller auslosen:
PROCEDURE PostOrder(req, res) HELP "POST: orders public"
LOCAL lcOrderId, loEvt, loResp
lcOrderId = THIS.CreateOrder(req.json)
* Build the webhook event
loEvt = THIS.newObject("event,data")
loEvt.event = "order.created"
loEvt.data = THIS.newObject("orderId,customer,total")
loEvt.data.orderId = lcOrderId
loEvt.data.customer = req.json.customer
loEvt.data.total = req.json.total
* Queue — FoxServer handles delivery, retries, signing
THIS.QueueWebhook("https://partner.com/webhooks", "shared-secret", loEvt)
loResp = THIS.newObject("orderId,status")
loResp.orderId = lcOrderId
loResp.status = "created"
res.status(201).json(THIS.ToJson(loResp))
ENDPROC Der Empfanger erhalt:
POST https://partner.com/webhooks
webhook-id: 550e8400-e29b-41d4-a716-446655440000
webhook-timestamp: 2026-04-11T14:23:45Z
webhook-signature: sha256=hmac-sha256-of-body
{
"event": "order.created",
"data": { "orderId": "ORD-001", "customer": "Irwin", "total": 99.99 }
} Hot Reload
Hot Reload erkennt Anderungen in der kompilierten DLL und ladt Controller neu, ohne den Server neu zu starten. Laufende Anfragen enden auf der alten Version; neue Anfragen verwenden die aktualisierte Version.
Funktionsweise:
- Bearbeiten und speichern Sie Ihre .prg-Datei in VFP.
- WinFx oder der VFP-Compiler regeneriert die Interop-DLL.
- FoxServer erkennt die Anderung in der DLL-Datei (FileSystemWatcher).
- Wartet auf den Abschluss aktiver Anfragen (graceful drain).
- Gibt COM-Referenzen auf alte Controller frei.
- Ladt die neue DLL in eine isolierte AppDomain.
- Protokolliert: 'Hot reload complete'.
In JSON aktivieren:
{
"hotreload": {
"enabled": true,
"watchpaths": ["C:\\projects\\myapi\\build"],
"excludepatterns": ["*.log", "*.tmp"]
}
} Server-Metriken
Der /status-Endpunkt (wenn aktiviert) gibt den aktuellen Serverzustand einschliesslich Leistungsmetriken zuruck.
GET /status
{
"status": "ok",
"version": "0.7.0",
"license": "Commercial",
"uptime": "5d 3h 22m",
"totalRequests": 182043,
"successRequests": 181998,
"errorRequests": 45,
"avgResponseMs": 12,
"activeConnections": 7,
"memoryMB": 245
} Metriken aus einem Controller abrufen:
PROCEDURE GetStatus(req, res) HELP "GET: status public"
LOCAL loMetrics, loResp
loMetrics = THIS.GetServerMetrics()
loResp = THIS.newObject("status,metrics")
loResp.status = "ok"
loResp.metrics = loMetrics
res.status(200).json(THIS.ToJson(loResp))
ENDPROC White Label
Ermoglicht es, zu verbergen, dass der Server mit FoxServer erstellt wurde. Nutzlich, wenn Sie ein Produkt unter Ihrer eigenen Marke vertreiben.
{
"whitelabel": {
"serverName": "Acme API Gateway",
"headerTitle": "Acme Corp",
"hideVersion": true
}
} Windows-Dienstmodus
FoxServer kann als Windows-Dienst installiert werden fur automatischen Start und Hintergrundbetrieb ohne Konsolenfenster.
Befehle:
# Install as service
FoxServer.exe --install-service --name "AcmeAPIServer"
# Uninstall service
FoxServer.exe --uninstall-service --name "AcmeAPIServer"
# Manage via Windows Services
services.msc Weiter: API-Referenz →