OpenAPI-Server

Hoste eine OpenAPI-3-REST-API direkt in einem Delphi-HTTP-Server. Spec-first oder Code-first, mit automatischer Swagger UI, Request-Validierung und CORS — die Spezifikation wird zur einzigen Quelle der Wahrheit.

TsgcWSAPIServer_OpenAPI

Ein einsatzbereiter API-Server, der sich in TsgcWebSocketHTTPServer einklinkt, eine OpenAPI-3-Spezifikation lädt (oder aus annotierten Pascal-Klassen erzeugt) und eingehende Requests anhand der operationId weiterleitet.

Komponentenklasse

TsgcWSAPIServer_OpenAPI

Spezifikation

OpenAPI 3.0

Plattformen

Windows, macOS, Linux, iOS, Android

Edition

Enterprise

Spec-first oder Code-first — in jedem Fall drei Zeilen

Komponente erstellen, Spezifikation laden (oder erzeugen), an einen HTTP-Server hängen. Die Komponente ordnet Routen zu, validiert Eingaben und liefert Swagger UI automatisch unter /docs aus.

uses
  sgcWebSocket, sgcWebSocket_Server_API_OpenAPI,
  sgcHTTP_OpenAPI_Server;

var
  Server: TsgcWebSocketHTTPServer;
  OpenAPI: TsgcWSAPIServer_OpenAPI;
begin
  Server := TsgcWebSocketHTTPServer.Create(nil);
  Server.Port := 8080;

  OpenAPI := TsgcWSAPIServer_OpenAPI.Create(nil);
  OpenAPI.OnRequest := HandleRequest;
  OpenAPI.OpenAPIOptions.Endpoint.ServeSwaggerUI := True;
  OpenAPI.OpenAPIOptions.Validation.ValidateRequest := True;
  OpenAPI.OpenAPIOptions.CORS.Enabled := True;

  OpenAPI.LoadFromFile('petstore.json');
  OpenAPI.Server := Server;
  Server.Active := True;
  // Swagger UI:  http://localhost:8080/docs
  // Raw spec:    http://localhost:8080/openapi.json
end;

procedure THost.HandleRequest(Sender: TObject;
  const aOperationId: string;
  const aContext: TsgcOpenAPIServerContext;
  var Handled: Boolean);
begin
  Handled := True;
  if aOperationId = 'getPetById' then
    aContext.RespondJSON(200, PetAsJSON(aContext.PathParamAsInteger('petId')))
  else
    Handled := False;
end;
uses
  sgcWebSocket_Server_API_OpenAPI,
  sgcHTTP_OpenAPI_Server_CodeFirst;

type
  [sgcServiceContract('Task Manager', '', '1.0.0')]
  [sgcRoute('/api/v1')]
  TTaskService = class
  public
    [sgcHttpGet] [sgcRoute('/tasks/{taskId}')]
    [sgcSummary('Get a task by ID')]
    [sgcResponse(200, 'The requested task')]
    [sgcResponse(404, 'Task not found')]
    procedure GetTask([sgcFromPath][sgcRequired] const taskId: Integer); virtual;
  end;

// Generate the spec from RTTI and feed it to the component:
var
  Scanner: TsgcOpenAPICodeFirstScanner;
begin
  Scanner := TsgcOpenAPICodeFirstScanner.Create;
  try
    OpenAPI.LoadFromString(Scanner.GenerateSpec(TTaskService));
  finally
    Scanner.Free;
  end;
  OpenAPI.Server := Server;
  Server.Active := True;
end;

Was steckt drin

Zwei Möglichkeiten, eine API zu definieren, vier Pipeline-Hooks, Validierung gegen die Spezifikation und eine Swagger-UI-Seite, die die Komponente selbst ausliefert.

Spec-first-Modus

Lade ein bestehendes OpenAPI-3-Dokument mit LoadFromFile oder LoadFromString. Routen, Parameter und Schemas werden geparst und bilden den Vertrag, den dein Server einhalten muss — JSON ändern, neu starten, fertig.

Code-first-Modus

Versehe Pascal-Klassen mit den Attributen sgcHttpGet / sgcRoute / sgcFromPath / sgcResponse; TsgcOpenAPICodeFirstScanner durchläuft die RTTI und erzeugt die Spezifikation zur Laufzeit — kein JSON von Hand zu schreiben.

Eingebaute Swagger UI

Aktiviere OpenAPIOptions.Endpoint.ServeSwaggerUI, und der Server veröffentlicht eine interaktive Try-it-out-Seite unter /docs, gespeist von /openapi.json — kein separater Docs-Build, kein statischer Export.

Request-Validierung

Validiert Body, Query-String, Pfad-Parameter und Pflichtfelder gegen die Schemas der Spezifikation. Im Fehlerfall liefert OnValidationError die vollständige Fehlerliste und ein Continue-Flag, um abzulehnen oder fortzufahren.

CORS

Setze OpenAPIOptions.CORS.Enabled := True, und der Server beantwortet Preflight-OPTIONS auf jeder Route und wendet deine Richtlinien für AllowOrigins / AllowHeaders / AllowMethods an.

Context-Helfer

TsgcOpenAPIServerContext stellt PathParamAs*, QueryParamAs*, HeaderValue, BodyAsString / BodyAsJSON sowie RespondJSON und ein RespondError im Stil von RFC 7807 bereit.

Pipeline-Ereignisse

OnBeforeRequest, OnAfterRequest, OnAuthenticate und OnException umschließen den Hauptbehandler OnRequest — abkürzen, protokollieren, authentifizieren oder Exceptions umleiten, ohne Unterklassen zu bilden.

Basispfad-Präfix

OpenAPIOptions.Endpoint.BasePath stellt jeder Route sowie den eingebauten Endpunkten /openapi.json & /docs ein Präfix voran, sodass die API hinter /api/v1 oder einem beliebigen anderen Namensraum liegen kann.

Validierungsattribute (Code-first)

sgcRequired, sgcMinLength, sgcMaxLength, sgcRange und sgcPattern erzeugen die passenden Schema-Constraints, sodass dieselben Regeln in der erzeugten Spezifikation erscheinen und zur Laufzeit erzwungen werden.

Spezifikationen & Referenzen

Maßgebliche Quellen für die Protokolle und Formate, die diese Komponente implementiert.

Dokumentation & Demos

Springe direkt zur Komponentenreferenz, hole dir die fertigen Demoprojekte und lade die Testversion herunter.

Online-Hilfe — OpenAPI-Server Vollständige Referenz für Eigenschaften, Methoden und Ereignisse dieser Komponente.
Demoprojekte — Demos\23.OpenAPI Zwei einsatzbereite Beispiele: Spec-first (Petstore-JSON) und Code-first (Task-Manager). Im sgcWebSockets-Paket enthalten — lade die Testversion unten herunter.
Benutzerhandbuch (PDF) Umfassendes Handbuch zu jeder Komponente der Bibliothek.

Bereit, eine dokumentierte REST-API auszuliefern?

Lade die kostenlose Testversion herunter und verwandle eine OpenAPI-Spezifikation in einen laufenden Delphi-Server — inklusive Swagger UI.