OpenAPI-server

Host een OpenAPI 3 REST-API rechtstreeks binnen een Delphi HTTP-server. Spec-first of code-first, met automatische Swagger UI, requestvalidatie en CORS — de spec wordt de enige bron van waarheid.

TsgcWSAPIServer_OpenAPI

Een drop-in API-server die in TsgcWebSocketHTTPServer wordt geplugd, een OpenAPI 3-spec laadt (of er een genereert uit geannoteerde Pascal-klassen) en binnenkomende requests dispatcht op basis van operationId.

Componentklasse

TsgcWSAPIServer_OpenAPI

Specificatie

OpenAPI 3.0

Platforms

Windows, macOS, Linux, iOS, Android

Editie

Enterprise

Spec-first of code-first — in beide gevallen drie regels

Maak het component aan, laad (of genereer) een spec en koppel het aan een HTTP-server. Het component matcht routes, valideert invoer en serveert Swagger UI automatisch op /docs.

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;

Wat zit erin

Twee manieren om een API te definiëren, vier pipeline-hooks, validatie tegen de spec en een Swagger UI-pagina die door het component zelf wordt geserveerd.

Spec-first-modus

Laad een bestaand OpenAPI 3-document met LoadFromFile of LoadFromString. Routes, parameters en schema's worden geparseerd en vormen het contract dat je server moet respecteren — wijzig de JSON, herstart, klaar.

Code-first-modus

Annoteer Pascal-klassen met sgcHttpGet- / sgcRoute- / sgcFromPath- / sgcResponse-attributen; TsgcOpenAPICodeFirstScanner doorloopt de RTTI en genereert de spec tijdens runtime — geen JSON die je met de hand hoeft te schrijven.

Ingebouwde Swagger UI

Zet OpenAPIOptions.Endpoint.ServeSwaggerUI aan en de server publiceert een interactieve try-it-out-pagina op /docs, gevoed door /openapi.json — geen aparte docs-build, geen statische export.

Requestvalidatie

Valideert de body, querystring, padparameters en verplichte velden tegen de schema's in de spec. Bij een fout geeft OnValidationError je de volledige foutenlijst en een Continue-vlag om te weigeren of door te gaan.

CORS

Zet OpenAPIOptions.CORS.Enabled := True en de server beantwoordt preflight-OPTIONS op elke route, met toepassing van je AllowOrigins- / AllowHeaders- / AllowMethods-beleid.

Context-helpers

TsgcOpenAPIServerContext stelt PathParamAs*, QueryParamAs*, HeaderValue, BodyAsString / BodyAsJSON beschikbaar plus RespondJSON en een RespondError in RFC 7807-stijl.

Pipeline-events

OnBeforeRequest, OnAfterRequest, OnAuthenticate en OnException omhullen de hoofd-OnRequest-handler — kortsluiten, loggen, authenticeren of excepties hermappen zonder subclassing.

Base path-prefix

OpenAPIOptions.Endpoint.BasePath plaatst een prefix vóór elke route en vóór de ingebouwde /openapi.json- & /docs-endpoints, zodat de API achter /api/v1 of een willekeurige namespace kan leven.

Validatie-attributen (code-first)

sgcRequired, sgcMinLength, sgcMaxLength, sgcRange en sgcPattern genereren de overeenkomstige schema-constraints, zodat dezelfde regels in de gegenereerde spec verschijnen en tijdens runtime worden afgedwongen.

Specificaties & referenties

Gezaghebbende bronnen voor de protocollen en formaten die dit component implementeert.

Documentatie & demo's

Spring direct naar de componentreferentie, pak de kant-en-klare demoprojecten en download de proefversie.

Online-hulp — OpenAPI-server Volledige property-, methode- en eventreferentie voor dit component.
Demoprojecten — Demos\23.OpenAPI Twee kant-en-klare voorbeelden: spec-first (Petstore JSON) en code-first (task manager). Meegeleverd in het sgcWebSockets-pakket — download hieronder de proefversie.
Gebruikershandleiding (PDF) Uitgebreide handleiding die elk component in de bibliotheek behandelt.

Klaar om een gedocumenteerde REST-API uit te rollen?

Download de gratis proefversie en maak van een OpenAPI-spec een draaiende Delphi-server — met Swagger UI inbegrepen.