OpenAPI Server

Ospita un'API REST OpenAPI 3 direttamente all'interno di un server HTTP Delphi. Spec-first o code-first, con Swagger UI automatica, validazione delle richieste e CORS — la specifica diventa l'unica fonte di verità.

TsgcWSAPIServer_OpenAPI

Un server API drop-in che si collega a TsgcWebSocketHTTPServer, carica una specifica OpenAPI 3 (o ne genera una da classi Pascal annotate) e smista le richieste in arrivo tramite operationId.

Classe del componente

TsgcWSAPIServer_OpenAPI

Specifica

OpenAPI 3.0

Piattaforme

Windows, macOS, Linux, iOS, Android

Edizione

Enterprise

Spec-first o code-first — tre righe in entrambi i casi

Crea il componente, carica (o genera) una specifica, collegala a un server HTTP. Il componente abbina le rotte, valida gli input e serve automaticamente Swagger UI su /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;

Cosa c'è dentro

Due modi per definire un'API, quattro hook nella pipeline, validazione rispetto alla specifica e una pagina Swagger UI servita dal componente stesso.

Modalità spec-first

Carica un documento OpenAPI 3 esistente con LoadFromFile o LoadFromString. Rotte, parametri e schemi vengono analizzati e diventano il contratto che il tuo server deve rispettare — modifica il JSON, riavvia, fatto.

Modalità code-first

Annota le classi Pascal con gli attributi sgcHttpGet / sgcRoute / sgcFromPath / sgcResponse; TsgcOpenAPICodeFirstScanner percorre l'RTTI e genera la specifica a runtime — nessun JSON da scrivere a mano.

Swagger UI integrata

Attiva OpenAPIOptions.Endpoint.ServeSwaggerUI e il server pubblica una pagina interattiva try-it-out su /docs, alimentata da /openapi.json — nessuna build separata della documentazione, nessun export statico.

Validazione delle richieste

Valida il body, la query string, i parametri di path e i campi obbligatori rispetto agli schemi nella specifica. In caso di errore, OnValidationError fornisce l'elenco completo degli errori e un flag Continue per rifiutare o proseguire.

CORS

Imposta OpenAPIOptions.CORS.Enabled := True e il server risponde ai preflight OPTIONS su ogni rotta, applicando la tua policy AllowOrigins / AllowHeaders / AllowMethods.

Helper di contesto

TsgcOpenAPIServerContext espone PathParamAs*, QueryParamAs*, HeaderValue, BodyAsString / BodyAsJSON insieme a RespondJSON e un RespondError in stile RFC 7807.

Eventi della pipeline

OnBeforeRequest, OnAfterRequest, OnAuthenticate e OnException avvolgono il gestore principale OnRequest — cortocircuita, registra, autentica o rimappa le eccezioni senza creare sottoclassi.

Prefisso base path

OpenAPIOptions.Endpoint.BasePath antepone un prefisso a ogni rotta e agli endpoint integrati /openapi.json e /docs, in modo che l'API possa risiedere dietro /api/v1 o qualsiasi namespace tu preferisca.

Attributi di validazione (code-first)

sgcRequired, sgcMinLength, sgcMaxLength, sgcRange e sgcPattern generano i corrispondenti vincoli di schema, così le stesse regole compaiono nella specifica generata e vengono applicate a runtime.

Specifiche e riferimenti

Fonti autorevoli per i protocolli e i formati implementati da questo componente.

Documentazione e Demo

Collegamenti diretti al riferimento del componente, progetti demo pronti all'uso e download della versione di prova.

Guida online — OpenAPI Server Riferimento completo di proprietà, metodi ed eventi per questo componente.
Progetti demo — Demos\23.OpenAPI Due esempi pronti all'uso: spec-first (Petstore JSON) e code-first (task manager). Inclusi nel pacchetto sgcWebSockets — scarica la versione di prova qui sotto.
Manuale utente (PDF) Manuale completo che copre ogni componente della libreria.

Pronto a rilasciare un'API REST documentata?

Scarica la versione di prova gratuita e trasforma una specifica OpenAPI in un server Delphi funzionante — con Swagger UI inclusa.