Servidor OpenAPI

Aloja una API REST OpenAPI 3 directamente dentro de un servidor HTTP Delphi. Spec-first o code-first, con Swagger UI automático, validación de peticiones y CORS — la especificación se convierte en la única fuente de verdad.

TsgcWSAPIServer_OpenAPI

Un servidor de API que se conecta directamente a TsgcWebSocketHTTPServer, carga una especificación OpenAPI 3 (o la genera a partir de clases Pascal anotadas) y despacha las peticiones entrantes por operationId.

Clase del componente

TsgcWSAPIServer_OpenAPI

Especificación

OpenAPI 3.0

Plataformas

Windows, macOS, Linux, iOS, Android

Edición

Enterprise

Spec-first o code-first — tres líneas en cualquier caso

Crea el componente, carga (o genera) una especificación y asóciala a un servidor HTTP. El componente empareja las rutas, valida las entradas y sirve Swagger UI en /docs automáticamente.

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;

Qué incluye

Dos formas de definir una API, cuatro hooks de pipeline, validación contra la especificación y una página Swagger UI servida por el propio componente.

Modo spec-first

Carga un documento OpenAPI 3 existente con LoadFromFile o LoadFromString. Las rutas, parámetros y esquemas se analizan y se convierten en el contrato que tu servidor debe respetar — cambia el JSON, reinicia, listo.

Modo code-first

Anota clases Pascal con los atributos sgcHttpGet / sgcRoute / sgcFromPath / sgcResponse; TsgcOpenAPICodeFirstScanner recorre el RTTI y emite la especificación en tiempo de ejecución — sin JSON que escribir a mano.

Swagger UI integrado

Activa OpenAPIOptions.Endpoint.ServeSwaggerUI y el servidor publica una página interactiva de prueba en /docs, alimentada por /openapi.json — sin compilación de documentación aparte ni exportación estática.

Validación de peticiones

Valida el cuerpo, la cadena de consulta, los parámetros de ruta y los campos requeridos contra los esquemas de la especificación. Si falla, OnValidationError te entrega la lista completa de errores y un flag Continue para rechazar o continuar.

CORS

Asigna OpenAPIOptions.CORS.Enabled := True y el servidor responde al preflight OPTIONS en cada ruta, aplicando tu política AllowOrigins / AllowHeaders / AllowMethods.

Helpers de contexto

TsgcOpenAPIServerContext expone PathParamAs*, QueryParamAs*, HeaderValue, BodyAsString / BodyAsJSON además de RespondJSON y un RespondError al estilo RFC 7807.

Eventos de pipeline

OnBeforeRequest, OnAfterRequest, OnAuthenticate y OnException envuelven al manejador principal OnRequest — corta el flujo, registra, autentica o remapea excepciones sin tener que crear subclases.

Prefijo de ruta base

OpenAPIOptions.Endpoint.BasePath antepone un prefijo a cada ruta y a los endpoints integrados /openapi.json y /docs, de modo que la API puede vivir detrás de /api/v1 o cualquier espacio de nombres que prefieras.

Atributos de validación (code-first)

sgcRequired, sgcMinLength, sgcMaxLength, sgcRange y sgcPattern emiten las restricciones de esquema correspondientes para que las mismas reglas aparezcan en la especificación generada y se apliquen en tiempo de ejecución.

Especificaciones y referencias

Fuentes autorizadas para los protocolos y formatos que implementa este componente.

Documentación y demos

Accede a la referencia del componente, descarga los proyectos de demo listos para ejecutar y prueba la versión de evaluación.

Ayuda en línea — Servidor OpenAPI Referencia completa de propiedades, métodos y eventos de este componente.
Proyectos de demo — Demos\23.OpenAPI Dos ejemplos listos para ejecutar: spec-first (Petstore JSON) y code-first (gestor de tareas). Incluidos en el paquete sgcWebSockets — descarga la versión de evaluación más abajo.
Manual de usuario (PDF) Manual integral que cubre cada componente de la librería.

¿Listo para publicar una API REST documentada?

Descarga la versión de evaluación gratuita y convierte una especificación OpenAPI en un servidor Delphi en funcionamiento — con Swagger UI incluido.