Van magazinethema naar projectpraktijk
Relevante dienst- en technische pagina's bij het artikel
Veel bedrijven staan vandaag voor een vergelijkbare situatie: een gegroeide bedrijfsapplicatie (vaak Delphi/VCL) dekt kernprocessen af, maar moet ineens nieuwe kanalen bedienen. Een klantenportaal heeft data en workflows nodig, mobiele gebruikers verwachten veilige toegang, derde systemen (ERP, DMS, CRM, BI) vragen om integraties. In die situatie lijkt een REST-API een logische stap. In de praktijk mislukken API-initiatieven echter zelden door HTTP of JSON – maar door onduidelijke verantwoordelijkheidsverdeling tussen client, server en dataopslag.
Een solide REST-server-architectuur met Delphi ontstaat niet door „een paar endpoints“ over bestaande databasetabellen te leggen. Ze ontstaat wanneer het bedrijf vakregels, beveiligingseisen, data-eigenaarschap, transactiegrenzen en operationele concepten gezamenlijk beschouwt. De REST-server wordt daarmee de stabiele contractlaag tussen vaklogica en consumenten: desktopclient, portaal, services, integratiepartners. Precies hier speelt Delphi zijn sterke punten uit: snelle ontwikkeling, robuuste runtime, performante native code, goede databasekoppeling (bijv. bij BDE-vervanging met native aansluiting) en de mogelijkheid om vaklogica gecontroleerd in bibliotheken of servermodules te kapselen.
Dit artikel beschrijft hoe bedrijven REST-servers met Delphi zo plannen dat ze vakinhoudelijk consistent blijven, in bestaande systeemlandschappen passen en in productie geen bron van storingen worden. De nadruk ligt op architectuurprincipes, typische valkuilen in moderniseringsprojecten en concrete bouwstenen voor beveiliging, dataaccess, versiebeheer en observability.
Waarom een REST-API in een bedrijf een architectuurbeslissing is
In een klassieke client-serverwereld waren veel regels impliciet in de desktopclient verspreid: validaties, statusovergangen, berekeningen, gedeeltelijk zelfs autorisaties. Zolang er maar één client was, was dat onkritisch – vakinhoudelijk niet schoon, maar beheersbaar. Zodra meerdere consumenten op dezelfde bedrijfsobjecten werken, kantelt dat model:
- Een portaal kan client-validaties niet „hergebruiken”.
- Mobiele apps moeten offline kunnen werken, maar mogen geen vakregels dupliceren.
- Integraties hebben stabiele, geversioneerde contracten en een heldere foutsemantiek nodig.
- Compliance vereist traceerbare toegang, rollenmodellen en auditmogelijkheden.
De API wordt de plaats waar vaklogica, rechten en dataaccess samenkomen. Daarom bepaalt de architectuur van die API of uw systeem op lange termijn uitbreidbaar blijft – of dat u enkel nieuwe technische schulden creëert.
Delphi als platform voor REST-servers: sterke punten en typische gebruiksscenario’s
Delphi wordt in bedrijven vaak geassocieerd met desktopapplicaties. Voor REST-servers is Delphi echter eveneens goed geschikt, vooral wanneer het gaat om hergebruik van bestaande vaklogica of performante services. Typische gebruiksscenario’s in B2B-omgevingen:
- API-laag voor bestaande software: bestaande Delphi-bedrijfsapplicatie blijft als UI bestaan, de REST-server kapselt dataaccess en regels voor nieuwe consumenten.
- Backend voor portaal-/klantgedeelte: webportaal gebruikt REST-endpoints die dezelfde regelkern gebruiken als interne processen.
- Integratie- en interface-server: ERP/DMS/CRM-koppelingen, import/export, eventverwerking, tijdgestuurde jobs.
- Linux-services of Windows-services: langlopende processen, queue-workers, schedulers, documentworkflows.
Beslissend is minder het frameworkslabel dan de discipline in lagen, concurentie, foutafhandeling en deployment. Delphi geeft beide mogelijkheden: snel leverbare iteraties en tegelijkertijd schone, modulaire architectuur – als u bewust ontwerpt.
Laagmodel: Layer-3-architectuur als basis voor duurzame APIs
Voor bedrijfssoftware heeft zich een helder, slank laagmodel bewezen. In het Delphi-domein wordt dit vaak beschreven als Layer-3-architectuur. De termen variëren, maar de verantwoordelijkheden moeten eenduidig zijn:
1) API-/Transportlaag (HTTP, serialisatie, routing)
Deze laag handelt HTTP, authenticatie op protocolniveau, request/response-formaten, routing, statuscodes, Content-Type, compressie. Hier horen geen vakregels thuis. Doel: uitwisselbaarheid en testbaarheid. Als u later van een REST-API naar aanvullende protocollen (bijv. WebSocket, gRPC-achtige patronen, Server-Sent Events) wilt uitbreiden, moet de vakkern stabiel blijven.
2) Domein-/Service-laag (vaklogica, use cases, rechten, transacties)
Hier leeft de vakinhoudelijke waarheid: statusmachines, berekeningen, plausibiliteiten, tenantregels, rechtencontroles op vakacties. Deze laag moet onafhankelijk van de UI zijn en bij voorkeur zonder HTTP-kennis kunnen werken. Idealiter implementeert u use cases zoals „opdracht vrijgeven”, „ticket sluiten”, „factuur aanmaken” in plaats van alleen CRUD op tabellen.
3) Data-Access-laag (repositories, SQL, FireDAC, mapping)
Deze laag kapselt persistentie: SQL, stored procedures, transactiesturing, lock-concepten, connection-pooling, DB-specifieke bijzonderheden. In Delphi is BDE-Ablosung mit nativer Anbindung vaak de pragmatische keuze, vooral bij migraties (BDE-vervanging) en bij heterogene databases (SQL Server, PostgreSQL, MariaDB, Firebird). Belangrijk is dat de Data-Access-laag geen HTTP-kennis heeft en geen businessbeslissingen neemt.
Dit model vermindert koppeling: wijzigingen in het datamodel dwingen niet meteen tot herschrijven van de API, en nieuwe clients erven automatisch dezelfde logica. Vooral bij Delphi-modernisering is dit de basis om gegroeide desktopapplicaties stapsgewijs te ontkoppelen zonder de operatie te onderbreken.
API-design voor bedrijfssoftware: niet CRUD maar vakinhoudelijke contracten
Veel APIs beginnen met endpoints zoals /customers, /orders, /documents en implementeren CRUD. Dat is voor interne tools soms voldoende, maar in bedrijfssoftware wordt dat snel te oppervlakkig. Vakprocessen bestaan uit statusovergangen, regels, neveneffecten en autorisaties.
Houd resources, acties en status duidelijk gescheiden
Een beter patroon is de combinatie van resources en duidelijke acties, bijvoorbeeld:
- Resource lezen: GET /orders/{id}
- Actie uitvoeren: POST /orders/{id}/release
- Document aanmaken: POST /orders/{id}/documents/invoice
- Status opvragen: GET /orders/{id}/status
Zo wordt in het API-contract zichtbaar dat „Vrijgeven” geen simpele veldupdate is. De server kan validaties, rechten, transacties, audit en nevenprocessen centraal afhandelen.
Foutsemantiek en validatie: maak fouten voorspelbaar voor clients
Bedrijfsclients moeten fouten kunnen onderscheiden: validatiefouten (400), gebrek aan toestemming (403), conflict door gelijktijdige wijziging (409), vakinhoudelijke afwijzing (vaak ook 409 of 422), tijdelijke backend-problemen (503). Belangrijk is een consistente foutenstructuur, bijv. met foutcode, message, optionele veldhint en een correlatie-ID. Zo kan een portaal begrijpelijke meldingen tonen en tegelijk support en operatie efficiënt traceren.
Beveiliging: authenticatie is niet hetzelfde als autorisatie
In B2B-contexten faalt beveiliging zelden door encryptie, maar door ontbrekende scheiding tussen identiteit, rollen en vakinhoudelijke autorisaties. Een REST-serverarchitectuur moet daarom twee lagen onderscheiden:
Authenticatie (wie is het?)
Gebruikelijke mechanismen zijn token-based benaderingen (bijv. JWT of opaque tokens), gecombineerd met TLS en een heldere sessiestrategie. Beslissend is: tokenlevensduur, refresh-mechanisme, intrekken bij rolwijzigingen en de vraag of u voor portalen en interne systemen verschillende identity-providers gebruikt. Delphi-servers kunnen zowel als resource-server optreden als – afhankelijk van de setup – tokens uitgeven. In veel bedrijfslandschappen is integratie met bestaande identity-systemen (bijv. AD/LDAP, SSO-oplossingen) een kernpunt.
Autorisatie (mag hij dat?)
Autorisatie hoort in de domein-/service-laag. Rollen en rechten zijn zelden puur technisch; ze hangen samen met tenant, locatie, organisatie-eenheid, contractstatus of procesfase. Goede praktijk:
- Rollenmodel (bijv. Admin, Behandelaar, Auditor) als basis
- Functionele policies („mag factuur alleen in status X aanmaken“, „mag alleen eigen tickets zien“)
- Multi-tenantondersteuning als standaard: iedere request heeft tenantcontext
- Auditing: wie heeft welke actie wanneer uitgevoerd
De API moet niet alleen „toegang toegestaan/afgewezen“ teruggeven, maar consequent op serverniveau voorkomen dat via parametertrucs data van andere tenants zichtbaar worden. Dat lijkt vanzelfsprekend, maar in gegroeide systemen is het een van de meest voorkomende architectuurfouten wanneer men te snel „tabellen op HTTP“ legt.
Dataaccess met FireDAC: transacties, pooling en database-strategie
In bedrijfsapplicaties is dataaccess de stabiliteitsfactor: piekbelasting, deadlocks, lange rapporten, gelijktijdige updates, batch-imports. FireDAC is in het Delphi-ecosysteem een beproefd onderdeel om verschillende databases met uniforme toegang te bedienen. Voor een REST-serverarchitectuur zijn vooral de volgende punten cruciaal:
Transactiegrenzen per use case
Een REST-API is typisch request-gebaseerd. Dat past goed bij „transactie per use case“: binnen een request wordt een transactie geopend, vakactiviteiten worden uitgevoerd, daarna commit/rollback. Belangrijk: zet niet automatisch elke endpoint in een transactie, maar wees consequent bij schrijfacties. Leesend endpoints kunnen, afhankelijk van isolation level, ook transacties nodig hebben als consistente views belangrijk zijn.
Connection-strategie en paralleliteit
Serverparalleliteit betekent: veel gelijktijdige requests, elk met DB-toegang. Plan daarom:
- beperkte, bewaakte poolgroottes
- time-outs voor queries en connecties
- duidelijke regels voor langlopende operaties (uitbesteden naar jobs/workers)
Een veelgemaakte fout is zware rapporten of massale data-exporten synchroon over dezelfde API-instantie te laten lopen die ook interactieve portaalvragen bedient. Beter is scheiding: interactief vs. batch/async.
Databasemodernisering als onderdeel van API-planning
Als er in het landschap nog oude dataaccesslagen bestaan (bijv. BDE), wordt de API een katalysator: zij dwingt duidelijke dataaccessgrenzen af. Een gecontroleerde vervanging naar FireDAC vermindert risico’s en verhoogt draagvlak (PostgreSQL, MariaDB, SQL Server). Belangrijk: plan dit niet als een „big bang“, maar stapsgewijs: nieuwe server-use-cases gebruiken al de nieuwe Data-Access-laag, terwijl legacy-onderdelen volgen.
Versionering en backward compatibility: API-contracten beschermen
Bedrijven onderschatten vaak hoe kostbaar breaking changes zijn. Zodra een klantenportaal, een partner-systeem of een Windows- und Linux-Services op uw API vertrouwt, kunt u niet zomaar velden hernoemen. Een duidelijke versieerstrategie is daarom verplicht.
Pragmatische regels voor versionering
- Geen breaking changes zonder versie: hernoem/verwijder geen velden, interpreteer endpoints niet anders.
- Uitbreiden in plaats van wijzigen: voeg nieuwe velden toe, markeer oude als deprecated.
- Compatibele defaults: vermijd nieuwe verplichte velden of leid ze server-side af.
- Explíciete versionering: bijv. /v1/… of via headers; belangrijker dan de methode is consequentie.
Voor Delphi-teams betekent dit ook: DTOs (Data Transfer Objects) stabiel houden en mapping bewust ontwerpen in plaats van domeinobjecten 1:1 te serialiseren. Dat kost aanvankelijk meer moeite, maar verlaagt op termijn supportkosten.
Observability: logs, metrics en traces vanaf het begin inplannen
In een productieve bedrijfsomgeving is „werkt bij mij“ waardeloos als fouten zich niet reproduceerbaar laten maken. Vooral REST-servers die veel consumenten bedienen, hebben een minimum aan observability nodig:
Gestructureerde logging met correlatie-ID
Elk request moet een correlatie-ID dragen (overnemen indien aanwezig of zelf genereren) en die ID moet in logs terugkomen. Logentries moeten gestructureerd zijn (bijv. JSON-log) zodat ze in centrale systemen kunnen worden geïnjecteerd. Minimaal relevant:
- request-methode, route, statuscode, duur
- user-/tenant-context (pseudonimiseren/regelconform)
- DB-duur en foutklasse
- correlatie-ID voor support
Metrieken voor capaciteit en fouttrends
Voor schaling en stabiliteit heeft u metriek nodig: requests per minuut, p95/p99-latenties, foutpercentages per endpoint, DB-poolbelasting, queue-lengtes. Dat hoeft geen „cloud-native overkill“ te zijn, maar zonder cijfers worden performance-discussies meningsvorming.
Fout- en uitzonderingafhandeling als architectuurelement
Delphi-exceptions mogen niet ongecontroleerd naar buiten vallen. Een centrale exception-middleware (of globale handler) moet exceptions vertalen naar consistente foutantwoorden, inclusief support-ID en passende HTTP-codes. Intern horen stacktraces in beveiligde logs, niet in client-antwoorden.
Synchroon vs. asynchroon: langlopende taken uit de REST-respons halen
Veel bedrijfsprocessen zijn niet „request/response in 200 ms“: PDF-generatie, data-import, interface-runs, afstemmingen, massawijzigingen, archivering. Deze workloads horen zelden in een synchroon REST-endpoint omdat ze threads binden, time-outs veroorzaken en gebruikers blokkeren.
Job-patroon
Bewezen is: een endpoint start een job en de server retourneert direct een job-ID. Een ander endpoint levert status/resultaat. Optioneel kan een callback/webhook informeren. In Delphi is dit realiseerbaar met worker-services, een job-tabel en een duidelijke statusmachine. Voordeel: stabiliteit en planbare schaalbaarheid.
Queues en services
Afhankelijk van de omgeving kan een message queue zinvol zijn, maar dat is niet altijd noodzakelijk. Belangrijk is het principe: interactieve APIs blijven responsief, batchprocessen lopen gecontroleerd, herhaalbaar en observeerbaar – als Windows-services of Linux-services, afhankelijk van deployment.
Deployment in bedrijven: Windows, Linux, containers, on-prem
Een REST-serverarchitectuur is pas „klaar“ als ze beheersbaar is. Bedrijven verschillen sterk: klassieke Windows-servers, gevirtualiseerde Linux-hosts, containerplatforms, strikte netwerkzones, proxy- en certificaatvereisten. Delphi is hier flexibel, mits afhankelijkheden zorgvuldig worden beheerd.
Configuratie en secrets
Configuratie moet omgevingsafhankelijk zijn (Dev/Test/Prod). Toegangsgegevens horen niet in EXE of repository. Gebruik veilige opslag (bijv. secrets-management van het platform) en scheid configuratiewaarden van code-releases. Plan ook rotaties (DB-wachtwoord, API-keys) zonder het systeem te hoeven herbouwen.
Release- en rollback-strategieën
Als meerdere consumenten op een API hangen, heeft u gecontroleerde releases nodig: migratiescripts voor DB-wijzigingen, feature-toggles voor stapsgewijze activering, duidelijke rollback-paden. Vooral databasewijzigingen moeten backward compatible zijn wanneer een rollback van de serverversie mogelijk moet blijven.
Integratie met legacy-software: stapsgewijze modernisering in plaats van Big Bang
In veel Delphi-landschappen is de vakinhoudelijke kern waardevol maar technisch „verkleefd“: UI-gedreven dataaccess, globale staten, gemengde verantwoordelijkheden. Een REST-API kan hier zowel risico als kans zijn. Het doel moet een pad zijn dat met aanvaardbare inspanning meetbare verbeteringen oplevert.
Strangler-approach voor APIs
In plaats van alles te herbouwen, definieert u vakgrenzen die echte waarde leveren: bijv. „orderstatus en documenten voor klantenportaal“, „masterdata-lookup voor mobiele gebruikers“, „interface voor ERP-boekingen“. Deze use cases worden als nieuwe API-functies geïmplementeerd, inclusief domeinlaag en dataaccess. De oude client kan stapsgewijs op dezelfde server-use-cases overschakelen zonder dat de UI direct herbouwd hoeft te worden.
Gedeelde vaklogica: nuttig, maar gecontroleerd
Delphi maakt het mogelijk vakbibliotheken zowel in de server als in bestaande applicaties te gebruiken. Dat kan een brug vormen, maar brengt risico’s: als UI-afhankelijkheden in de gedeelde logica lekken, verliest u de ontkoppeling. Een heldere regel helpt: gedeeld mag alleen logica zijn zonder UI, zonder globale staten, met duidelijke interfaces en testbare units. De rest blijft gescheiden.
Typische fouten in REST-serverprojecten – en hoe ze te vermijden
„We publiceren gewoon tabellen”
Wanneer endpoints direct tabellen spiegelen, ontstaat een instabiel systeem: elke DB-refactor is een API-breaking change, vakregels worden in clients gedupliceerd en beveiligingslekken door ongecontroleerde parameters zijn waarschijnlijker. Beter: domein-use-cases en DTOs die het contract stabiliseren.
Vakautorisaties alleen in de client
Clients zijn vervangbaar en manipuleerbaar. Autorisatie hoort in de server en moet vakregels in acht nemen, niet enkel technische rollen.
Geen duidelijke strategie voor concurentie
Gelijktijdige updates gebeuren: twee behandelaars, portaal en interne client, of een importjob. Zonder optimistic locking (bijv. RowVersion/Timestamp), conflictcodes (409) en heldere merge-regels ontstaan dataverlies of „laatste schrijft wint“-fouten.
Langlopende taken blokkeren interactieve endpoints
Synchrone PDF-productie of exports leiden tot time-outs en ervaren „hangen“. Het job-patroon met status-endpoints is beter.
Observability wordt achteraf aangeplakt
Zonder correlatie-ID, gestructureerde logs en metrics wordt elke storing een zoektocht. Observeerbaarheid is geen luxe maar een operationele voorwaarde.
Concrete checklist voor uw REST-serverarchitectuur met Delphi
- Scheiding van lagen: Transport (HTTP), Domein (Use Cases), Data Access (FireDAC/SQL).
- Begrijp de API als contract: DTOs stabiel houden, versiebeheer plannen, breaking changes vermijden.
- Beveiliging in twee stappen: Authenticatie (tokens) plus autorisatie (vakpolicies, tenant).
- Transacties weloverwogen inzetten: per use case, time-outs, conflictstrategie.
- Langlopende taken asynchroon: jobs/workers, Windows- of Linux-services.
- Observability inbouwen: correlatie-ID, gestructureerde logs, metrics, centrale foutafhandeling.
- Realistische deploymentplanning: configuratie/secrets, rollback, databasemigraties.
- Iteratieve modernisering: waardevolle use cases eerst, legacy geleidelijk ontkoppelen.
Conclusie: REST-servers ontplooien hun waarde pas als operationele en vakarchitectuur
Een REST-serverarchitectuur met Delphi is voor bedrijven vooral effectief wanneer ze niet als „technische laag“ wordt gezien, maar als verbindende kern tussen processen, data en kanalen. Beslissend zijn schone lagen (Layer-3-architectuur), vakinhoudelijk gemodelleerde endpoints, consequente beveiligings- en tenantlogica, en een operationeel model met versiebeheer, monitoring en gecontroleerde concurentie. Daarmee wordt de API een stabiel platform: voor portalen, integraties, services en de stapsgewijze Delphi-modernisering – zonder de vakinhoudelijke kern van een gegroeid systeem te riskeren.
Als u wilt onderzoeken hoe een robuuste REST-API op uw bestaande Delphi-landschap kan worden opgezet (inclusief database-strategie, FireDAC, services en operatie), bereikt u ons hier: https://net-base-software-gmbh.de/kontakt/
volgende stap
Wanneer het onderwerp een concreet project wordt, moeten architectuur, bestaande omgeving en exploitatie vroegtijdig samen worden bekeken.
We ondersteunen niet alleen bij individuele vragen, maar ook wanneer uit broncodefragmenten, legacy-onderwerpen of portalideeën een robuust bedrijfsproject moet ontstaan.
- Huidige situatie, doelbeeld en technische risico's worden gezamenlijk beoordeeld.
- REST, toegang tot gegevens, portalen en rollout worden niet naar latere fasen verschoven.
- U ziet vroeg welke weg economisch en operationeel levensvatbaar is.