Fra magasinetema til prosjektpraksis
Egnede tjeneste- og tekniske sider for innlegget
Video-Botschaft
Utvikle REST-server med Delphi: arkitektur, sikkerhet og drift i praksis
Kurz erklärt, warum bei Delphi-REST-Servern nicht der erste funktionierende Endpunkt zählt, sondern Architektur, Security und Betrieb: konsistente Fehler, Authentifizierung, Logging/Monitoring und sauberes Deployment für Windows und Linux.
Video mit KI erstellt
Transkript anzeigen
Hallo, ich bin Mark. Der erste funktionierende REST-Endpunkt ist oft der Anfang der Probleme, nicht das Ende.
Im Beitrag „REST-Server mit Delphi entwickeln: Architektur, Sicherheit und Betrieb in der Praxis“ geht es genau darum. In Unternehmen scheitern APIs selten an Delphi oder am Framework.
Sie scheitern an Betrieb: uneinheitliche Fehler, fehlende Zeitlimits, unklare Zuständigkeiten. Und an Sicherheit: Authentifizierung, also wer sich ausweist, und Autorisierung, also was jemand darf.
Wichtig ist eine klare Trennung: vorne HTTP und Validierung, in der Mitte die Fachlogik, hinten Datenzugriff. Dazu gehören Logging und Monitoring, damit Sie Störungen nachvollziehen, bevor Nutzer Tickets schreiben.
Wenn Sie dazu Fragen haben, klären wir gern die typischen Stolperstellen aus der Praxis.
Den som vil utvikle en REST-server med Delphi , følger sjelden et mål i seg selv i virksomheter. Som regel handler det om robuste grensesnitt mellom etablerte systemer, portaler, tjenester og databaser – med klare krav til drift, sikkerhet og vedlikehold. Avgjørende er ikke hvor raskt et første endepunkt svarer, men om tjenesten forblir stabil i daglig drift: etterprøvbare feilmønstre, kontrollert datatilgang, korrekt autentisering, tydelige ansvarsområder i arkitekturen og et deployment som passer til Windows- og Linux-miljøer.
Delphi er i mange organisasjoner en pragmatisk vei: eksisterende forretningslogikk kan gjenbrukes, ytelsen er som regel tilstrekkelig, og det finnes flere måter å realisere HTTP-baserte APIer på. I praksis skiller alternativene seg mindre i „kan tilby REST“, og mer i transparens og drift: Hvor konsistent kan logging, timeouts, reverse-proxy-regler, versjonshåndtering, OpenAPI-dokumentasjon og sikkerhetsmekanismer gjennomføres?
Denne artikkelen plasserer de viktigste Delphi-tilnærmingene og viser hva IT-ledelse, administratorer og tekniske prosjektansvarlige bør være oppmerksomme på: fra API-design via sikkerhet og BDE-utfasing med native tilkobling og datatilgang til observability (logger, metrikker, tracing) og deployment som Windows- eller Windows- og Linux-tjenester. Målet er et robust grunnlag for integrasjoner mot ERP, DMS, CRM eller kundeportaler – uten at rammeverkets interne detaljer blir i sentrum.
Når en REST-server i Delphi er spesielt aktuell
Ett Delphi-REST-backend gir ofte god mening når Delphi allerede er etablert i virksomheten, eller når forretningslogikk og datatilgang fra eksisterende applikasjoner skal gjenbrukes. Typiske B2B-situasjoner:
- Gjør eksisterende programvare API-tilgjengelig: En VCL-applikasjon eller en klient-server-kjerne får et REST-lag, slik at portaler, eksterne systemer eller interne tjenester kan aksessere funksjonalitet på en standardisert måte.
- Integrasjon og avkobling: Flere consumere (desktop, web-portal, batch, partnere) skal bruke de samme forretningsprosessene uten direkte databaseaksess eller filgrensesnitt.
- Modernisering i etapper: Først innføre en stabil API, deretter gradvis modernisere UI, moduler eller databasen. APIen blir en kontrollert grenseflate og reduserer sideeffekter.
- Drift og sikkerhet: HTTP-APIer kan enkelt driftes bak reverse-proxyer, sentral autentisering og integreres i overvåkingsstabler.
Viktig er forventningsstyring: REST er et integrasjonsgrensesnitt, ikke en erstatning for faglig konsistens. Den som starter uten et klart domenemodell, definerte transaksjonsgrenser eller tydelig datansvar, ender fort opp med en API som er tilgjengelig, men som over tid blir dyr i vedlikehold og support.
REST-server med Delphi: alternativer i oversikt
Delphi tilbyr flere veier til en REST-tjeneste. For beslutningstakere handler det mindre om hva som er «moderne», og mer om hvor godt det passer teamstruktur, driftsmodell, levetid og compliance-krav.
Delphi WebBroker: slank, transparent, godt kontrollerbart
WebBroker er et etablert Delphi-rammeverk for HTTP-applikasjoner. Det ligger nært protokollen (request/response), er derfor lett å etterprøve og attraktivt i mange B2B-scenarier hvor kontrollert feilhåndtering, korrekt header-håndtering og en begrenset stack er viktig. WebBroker lar seg typisk drifte godt bak en reverse proxy som terminerer TLS og håndhever sentrale sikkerhetsregler.
Konsekvens i praksis: Mange komfortfunksjoner (routing-konvensjoner, middleware-kjeder, vedlikehold av OpenAPI) må suppleres strukturert. Det er ikke et minus hvis arkitekturstandarden allerede er i fokus.
Delphi Horse: routing og middleware for klare API-standarder
Delphi Horse er lettvekts og bygger på forståelig routing pluss middleware-prinsippet. Middleware betyr her gjenbrukbare behandlingssteg rundt endepunktet, for eksempel autentisering, logging, rate limits eller request-validering. For mange team er dette en produktiv tilnærming fordi standarder kan håndheves sentralt.
Viktig for drift: definer tidlig et enhetlig feilformat, timeouts, maksimal request-størrelse og en logging-standard. Uten slike retningslinjer forblir systemet funksjonelt, men blir unødvendig krevende i support og ved utvidelser.
RAD Server: plattformtilnærming med integrerte komponenter
RAD Server (tidligere EMS) er mer en plattformløsning med innebygde funksjoner som brukerstyring og andre byggeklosser. Det kan passe der flere klienter trenger et felles backend og plattformfunksjonene brukes målrettet. For rene integrasjons-APIer er det ikke nødvendigvis det beste valget; her teller ofte transparens, lave avhengigheter og en slank driftsmodell mer.
DataSnap: eksisterende installasjoner realistisk vurdere
DataSnap er historisk til stede i mange Delphi-landskap og kan eksponere HTTP/REST-liknende endepunkt. For nye initiativer bør man likevel vurdere om det passer med ønsket API-stil, autentisering (f.eks. JWT), OpenAPI/Swagger og moderne driftskrav. Ofte er en pragmatisk vei å gjenbruke eksisterende logikk internt, men eksponere en klart definert REST-API som håndhever standarder for sikkerhet, logging og versjonering.
Arkitektur som tåler drift og vedlikehold
En vanlig feil i REST-prosjekter er «handler gjør alt»: HTTP-parametre leses inn, SQL bygges direkte, forretningsregler implementeres og logging legges på – alt i samme sted. Det virker raskt i starten, men fører til dårlig testbar kode og ustabile endringer.
I virksomhetsmiljøer fungerer tydelig lagdeling godt. En praktisk, utbredt struktur er en Layer-3-arkitektur (tre lag) som skiller ansvarsområder:
Transport-lag: HTTP, autentisering, validering, svarformat
Her mottas requesten, grunnleggende validering utføres og et konsistent svarformat produseres. Dette laget inneholder også autentisering og autorisasjon (hvem har tilgang til hva) samt tekniske regler som request-limiter, CORS eller tildeling av correlation-IDs (unik ID per forespørsel for sporing).
Domenelag: faglige use-cases i stedet for endepunktlogikk
Domenet kapsler inn faglige prosesser som «opprett ordre», «endre status» eller «knytt dokument». Avgjørende er at denne logikken er så uavhengig av HTTP-rammeverket som mulig. Da kan samme domene også brukes av en Windows- og Linux-tjeneste, en Linux-daemon eller et batch-prosjekt uten å duplisere logikk.
Persistens og integrasjon: FireDAC, database, ERP/DMS/SMTP
Dette laget samler tilgang til databaser og eksterne systemer. For Delphi er BDE-Ablosung mit nativer Anbindung den vanlige dataaksessstakken for å knytte til PostgreSQL, SQL Server, MariaDB/MySQL eller Firebird på en ryddig måte. Viktig er ikke bare «bruk FireDAC», men bindende regler: connection-håndtering, transaksjonsgrenser, timeouts, parameterbinding, oversetting av tekniske feil til API-feilkoder og enhetlige retry-strategier der det faglig gir mening.
API-design: stabil over år, ikke bare til go-live
I B2B-miljøer er en API et langsiktig vedlikeholdt grensesnitt. Nøkkelbegrepet er kompatibilitet: Consumere stoler på felter, statuskoder og semantikk. Jo klarere disse reglene er, desto mindre arbeid i integrasjon, support og releasehåndtering.
Ressurser og stier: konsistens framfor kreativitet
Stabile APIer er typisk ressursorienterte: „/customers“, „/orders/123“, „/orders/123/items“. Prosesshandlinger kan modelleres som sub-ressurser eller velbegrunnede action-endepunkt, for eksempel „/orders/123/cancel“ når et rent CRUD-modell ikke dekker domenet. Det viktige er en enhetlig konvensjon som dokumenteres og brukes på tvers av teamet.
HTTP-metoder og statuskoder: klare signaler for consumer
En API er lettere å integrere når den følger forventet HTTP-semantikk: GET for lesing, POST for opprettelse, PUT/PATCH for endringer, DELETE for sletting. Like viktig er konsistent feilhåndtering. For drift er et standardisert feilsobjekt nyttig med:
- HTTP-status (f.eks. 400, 401, 403, 404, 409, 422, 500)
- stabil feilkode (maskinlesbar, dokumentert)
- Correlation-ID (for rask sporing i logger)
- valgfri detaljer (f.eks. feltfeil ved validering)
Et vanlig fallgruve er «200 OK» svar som inneholder feilmelding i body. Det kompliserer integrasjoner og skaper feilutsatt klientlogikk.
Versjonering og kompatibel utvidelse
Versjonering er et prosess- og kommunikasjonsproblem, ikke bare et teknisk spørsmål. Vanlige tilnærminger er versjon i URL (f.eks. „/api/v1“) eller header-basert versjonering. I mange virksomheter er likevel hovedprinsippet: kompatibel utvide. Å legge til nye felter er ofte uproblematisk. Å fjerne eller omdefinere felt krever ny versjon og et tydelig kommunisert migrasjonsvindu. Det reduserer integrasjonsbrudd og gjør releases forutsigbare.
Sikkerhet: autentisering, autorisasjon, angrepsflater
En REST-tjeneste er en potensiell innfallsvinkel. Mange sikkerhetsproblemer oppstår ikke av manglende kryptering, men av detaljfeil: for vide rettigheter, for lange token-tider, ubeskyttede admin-endepunkter, ukontrollerte CORS-regler eller logger med sensitive data.
TLS og Reverse Proxy: klare ansvarsforhold i nettverket
I typiske oppsett termineres TLS i reverse proxy (f.eks. Nginx, Apache eller Microsoft IIS som reverse proxy). Delphi-tjenesten kjører internt over HTTP og er kun tilgjengelig fra nettverket internt. Viktig er korrekte regler for «X-Forwarded-For» og «X-Forwarded-Proto», slik at klient-IP og protokoll tolkes riktig. Disse opplysningene er relevante for revisjon, rate limiting og feilsøking.
JWT, API-Keys og SSO: hva som passer i praksis
For system-til-system-integrasjoner er API-Keys eller client-credentials-mekanismer vanlig. For brukeraksesser i bedriftskontekster er JWT (JSON Web Token) sammen med en sentral Identity Provider (f.eks. OIDC) ofte praktisk. I SSO-landskap kan også SAML 2.0 være relevant (en standard for single sign-on, vanligvis mellom portal/gateway og identity provider).
Uavhengig av metode bør dere definere:
- Nøkkel- og sertifikatsrotasjon (hvordan fornyes signaturer?)
- Roller/Scopes (hvilke rettigheter gjelder for hvilke endepunkt?)
- Multitenancy (hvordan håndheves tenant-tilordning korrekt?)
- Audit-logging (hvem utløste hvilken faglig handling og når?)
Input-validering, CORS og Rate Limiting
Input-validering bør være flerlags: syntaktisk (datatyper, JSON-struktur), faglig (verdigrunnlag, statusoverganger) og sikkerhetsrelevant (filnavn, stier, headere). For nettleserklienter blir CORS viktig (regler for hvilke origins og headere som er tillatt). CORS bør konfigureres restriktivt. Rate Limiting beskytter mot misbruk og lasttopper; ofte implementeres det i reverse proxy og suppleres med server-side begrensninger (maksimal body-størrelse, timeouts, begrenset parallellitet).
FireDAC og databaseaksess: Stabilitet skapes gjennom regler
I REST-backender er databaseaksess ofte den dominerende faktoren for latens og stabilitet. FireDAC gir tekniske muligheter, men driftssikkerhet kommer gjennom retningslinjer.
Connection-håndtering og samtidighet
En klassisk feil er en global delt databaseforbindelse som brukes parallelt av flere requests. I en REST-server med parallell behandling (tråder/worker) må det være klart hvilke objekter som er trådsikre og hvilke ikke. I praksis betyr det: håndter forbindelser og query-objekter separat per request eller per Unit-of-Work, eller bruk kontrollert pooling avhengig av servermodellen. Det reduserer deadlocks, sporadiske feil og vanskelig reproducerbare problemer.
Transaksjoner langs use-cases
Transaksjoner bør ligge i domenet: en use-case avgjør hva som hører atomisk sammen. Ofte er «en request = en transaksjon» fornuftig, men ikke alltid. Read-only endepunkter trenger ofte ingen eksplisitt transaksjon, mens skrivende prosesser må endre flere tabeller konsistent. Ved eksterne integrasjoner (ERP, DMS, webhooks) er distribuerte transaksjoner som regel urealistiske; her hjelper klare sekvenser og kompensasjonslogikk (hvordan reverseres et delvis gjennomført steg?).
Timeouts, backpressure og kontrollert feiling
Uten timeouts bygger forespørsler, tråder og DB-forbindelser seg opp. Sett derfor timeouts både på HTTP- og DB-nivå. I tillegg er backpressure viktig: begrens parallellitet og kølengder slik at systemet under høy belastning kan svare kontrollert med 503 (Service Unavailable) i stedet for å krasje ved ressursuttømming. For drift er et raskt, klart feilmønster bedre enn minutter lange heng.
Payloads, DTOs og langsiktig kompatibilitet
JSON er standarden, men interoperabilitet avhenger av detaljer: dato-/tidsformat, tidssoner, null-verdier, desimalrepresentasjon, feltnavn og encoding. Velg en standard (f.eks. ISO-8601 i UTC) og følg den konsekvent.
DTOs i stedet for å publisere databasestrukturer
DTOs (Data Transfer Objects) er API-datamodeller optimalisert for utveksling. De bør ikke bare speile databasetabeller. På den måten unngår du at interne skjemaendringer umiddelbart fører til API-brudd. I tillegg kan du styre hvilke interne felt som ikke eksponeres (f.eks. flagg, audit-kolonner) og hvordan du senere kan refaktorisere internt uten å risikere integrasjoner.
Idempotens og retries
I bedriftsnettverk er timeouts og retries normalt. Definer hvilke operasjoner som er idempotente (flere kjøringer gir samme resultat) og hvordan doble POSTs unngås, for eksempel ved bruk av en Idempotency-Key for enkelte skriveoperasjoner. Det reduserer duplikater, inkonsistente tilstander og supporttilfeller.
Dokumentasjon og tester: OpenAPI som felles arbeidsgrunnlag
En API brukes sjelden bare av ett team i B2B. OpenAPI (Swagger) er derfor en praktisk felles språkform, fordi spesifikasjoner kan automatiseres: klientgenerering, mocking, contract-tester og diffing mellom versjoner. Selv om Delphi-stacken ikke genererer alt automatisk, er en vedlikeholdt spesifikasjon et sentralt artefakt.
Pragmatiske tester som reduserer driftskostnader
En fornuftig teststruktur for REST-tjenester består ofte av tre nivåer:
- Unit-tester for domenelogikk (uten HTTP, uten database)
- Integrasjonstester for dataaksess og transaksjonsatferd (med testdatabase og repeterbare seed-data)
- API-/contract-tester mot en kjørende tjeneste (statuskoder, auth, feilformater, versjonering)
For administratorer og driftsteam er det viktig at tester er reproduserbare og ikke avhenger av utviklermiljøer. Jo mer testmiljøet ligner sluttdeployment, desto lavere risiko for overraskelser etter oppdateringer.
Deployment og drift: Windows-tjeneste, Linux-tjeneste, containere
En REST-server anses i praksis først som «klar» når den kan driftes stabilt: start/stop-adferd, log-rotasjon, oppdateringer, rettigheter, portåpninger, sertifikater, overvåking og klare rollback-mekanismer.
Windows- og Linux-tjenester: veletablerte driftsmodeller
Under Windows er drift som en Windows-tjeneste ofte hensiktsmessig fordi mekanismer for starttype, recovery, rettigheter og overvåking finnes. Under Linux brukes ofte en systemd-tjeneste (systemd er standard tjenesteansvarlig) som kontrollerer restart-policyer, logging-tilknytning og startrekkefølge. For begge miljøer gjelder: en reverse proxy foran forenkler TLS, header-policyer, rate limits og routing.
Containere: reproduserbart, men kun med klar state-separasjon
Containere kan standardisere deployment og akselerere rollouts. Forutsetningen er klar separasjon av state: database eksternt, filer i volumer, secrets via et secret-management. Uten denne disiplinen oppstår uoversiktlige blandingstilstander som blir vanskelige å drifte og gjenopprette.
Konfigurasjon: sporbar, miljøseparert, ingen secrets i repo
Et konsistent konfigurasjonsmønster hjelper: separate innstillinger for dev/test/prod, sentral definisjon av log-nivå, DB-tilkoblingsdata, timeouts, tillatte origins og token-nøkler. Sensitive opplysninger hører ikke i kildekode-repositoriet. For revisjoner og drift er det viktig at konfigurasjonsendringer er sporbare og kan rulles ut kontrollert.
Observability: logger, metrikker og tracing som driftsforutsetning
Når integrasjoner stopper opp trenger driften svar: Hvilke endepunkter er berørt, siden når, med hvilken feilrate og hvilken avhengighet er treg? Uten observability blir hver hendelse manuell detektivjobb.
Strukturert logging og Correlation-IDs
Strukturert logging (key/value eller JSON) muliggjør analyser via verktøy og forenkler filtrering etter endepunkt, tenant, feilkode eller Correlation-ID. Hver forespørsel bør få en Correlation-ID som også returneres i response-header. Sensitive data som passord, tokens eller personopplysninger må ikke logges; her hjelper masking, hashing eller målrettede debug-logger i avgrensede miljøer.
Metrikker for kapasitet og stabilitet
Praktisk brukte metrikker er request-rate, latenser (f.eks. p95/p99), feilmengder per endepunkt, DB-tider, antall aktive workere/tråder, connection-utnyttelse og kølengder. Disse verdiene danner grunnlag for kapasitetsplanlegging og hjelper å avdekke smygende problemer (manglende indekser, nye avhengigheter, ugunstige spørringsmønstre).
Moderniseringsløp: REST som stabil grenseflate for etablerte Delphi-systemer
I mange Delphi-landskap er REST-APIen ikke endelig mål, men et stabiliserende og moderniserende element. En velprøvd, lavrisiko tilnærming er trinnvis:
- Prioriter use-cases: Hvilke funksjoner må være tilgjengelige eksternt (masterdata, statusendringer, dokumenttilgang, godkjenninger)?
- Fastlegg API-standarder: autentisering, feilformat, versjonering, logging, timeouts, rate limits, OpenAPI.
- Ekstraher domenet: strukturer forretningslogikk slik at den ikke er bundet til UI eller enkelte endepunkt.
- Konsolider datatilgang: FireDAC-regler, transaksjonskonsept, performance-baselines, query-policyer.
- Flytt consumere gradvis: desktop, portaler og øvrige tjenester bruker APIen; direkte DB-aksesser reduseres.
Resultatet blir et system som kan videreutvikles i etapper: moduler kan byttes ut uten at endringer utilsiktet slår gjennom i alle klienter.
Typiske fallgruver i B2B-REST-prosjekter
Noen feilmønstre går igjen og kan unngås med klare regler:
- Uensartede feilformater: Support og integrasjon blir unødvendig komplisert. Løsning: standardisert feilsobjekt med stabile feilkoder.
- Sikkerhet som tillegg: Roller, multitenancy og audit legges på «senere». Løsning: planlegg som grunnstruktur, ikke improviser per endepunkt.
- Ingen grenser: manglende body-limiter, timeouts og parallellitetsgrenser fører til nedetid under last. Løsning: reverse proxy pluss server-side backpressure.
- Database for tett koblet til API: Hver skjemaendring bryter consumere. Løsning: DTOer og klart definerte use-cases.
- For liten observabilitet: Problemer er ikke målbare. Løsning: Correlation-IDs, strukturert logging, kjerne-metrikker.
Konklusjon: REST med Delphi betyr ansvar for grensesnitt og drift
Å utvikle en REST-server med Delphi lykkes bærekraftig i virksomheter når arkitektur og drift planlegges sammen fra starten. Valg av rammeverk (WebBroker, Horse, RAD Server eller en migrasjonsvei fra DataSnap) er relevant, men ikke den største løftearmen. Forskjellen gjør klare standarder for API-design, autentisering, feilhåndtering, versjonering, FireDAC-dataaksess, timeouts samt observability og deployment som Windows- eller Linux-tjeneste. Slik blir en grensesnittløsning en stabil integrasjonskomponent som muliggjør modernisering i stedet for å blokkere den.
I det faglige landskapet spiller også Delphi REST-API og Delphi REST-API og REST-server en viktig rolle når integrasjoner, dataflyt og videreutvikling må spille ordentlig sammen.
Diskuter prosjekt eller moderniseringsinitiativ med Net-Base.
Neste steg
Når et tema blir et reelt prosjekt, bør arkitektur, eksisterende systemer og drift tidlig vurderes samlet.
Vi bistår ikke bare med enkeltspørsmål, men også når kodesnutter, legacy-temaer eller portalideer skal utvikles til et robust virksomhetsprosjekt.
- Eksisterende tilstand, målbildet og tekniske risikoer vurderes samlet.
- REST, datatilgang, portaler og utrulling blir ikke utsatt som sene følger.
- Dere ser tidlig hvilken vei som er økonomisk og driftsmessig levedyktig.