Servidor OpenAPI

Hospede uma API REST OpenAPI 3 diretamente dentro de um servidor HTTP Delphi. Spec-first ou code-first, com Swagger UI automático, validação de requisições e CORS — a especificação se torna a única fonte da verdade.

TsgcWSAPIServer_OpenAPI

Um servidor de API plug-and-play que se conecta ao TsgcWebSocketHTTPServer, carrega uma especificação OpenAPI 3 (ou gera uma a partir de classes Pascal anotadas) e despacha as requisições recebidas pelo operationId.

Classe do componente

TsgcWSAPIServer_OpenAPI

Especificação

OpenAPI 3.0

Plataformas

Windows, macOS, Linux, iOS, Android

Edição

Enterprise

Spec-first ou code-first — três linhas de qualquer forma

Crie o componente, carregue (ou gere) uma especificação, conecte-a a um servidor HTTP. O componente faz o match das rotas, valida as entradas e serve o Swagger UI em /docs automaticamente.

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;

O que tem por dentro

Duas formas de definir uma API, quatro hooks de pipeline, validação contra a especificação e uma página Swagger UI servida pelo próprio componente.

Modo spec-first

Carregue um documento OpenAPI 3 existente com LoadFromFile ou LoadFromString. Rotas, parâmetros e schemas são analisados e tornam-se o contrato que seu servidor deve honrar — altere o JSON, reinicie, pronto.

Modo code-first

Anote classes Pascal com atributos sgcHttpGet / sgcRoute / sgcFromPath / sgcResponse; o TsgcOpenAPICodeFirstScanner percorre o RTTI e emite a especificação em tempo de execução — sem JSON para escrever à mão.

Swagger UI integrado

Ative OpenAPIOptions.Endpoint.ServeSwaggerUI e o servidor publica uma página interativa de testes em /docs, alimentada por /openapi.json — sem build separado de documentação, sem exportação estática.

Validação de requisições

Valida o corpo, a query string, parâmetros de caminho e campos obrigatórios contra os schemas da especificação. Em caso de falha, OnValidationError fornece a lista completa de erros e uma flag Continue para rejeitar ou prosseguir.

CORS

Defina OpenAPIOptions.CORS.Enabled := True e o servidor responde ao preflight OPTIONS em cada rota, aplicando sua política AllowOrigins / AllowHeaders / AllowMethods.

Helpers de contexto

TsgcOpenAPIServerContext expõe PathParamAs*, QueryParamAs*, HeaderValue, BodyAsString / BodyAsJSON além de RespondJSON e um RespondError no estilo RFC 7807.

Eventos de pipeline

OnBeforeRequest, OnAfterRequest, OnAuthenticate e OnException envolvem o handler principal OnRequest — faça short-circuit, logue, autentique ou remapeie exceções sem criar subclasses.

Prefixo de base path

OpenAPIOptions.Endpoint.BasePath antepõe um prefixo a cada rota e aos endpoints integrados /openapi.json e /docs, para que a API possa viver atrás de /api/v1 ou qualquer namespace que você quiser.

Atributos de validação (code-first)

sgcRequired, sgcMinLength, sgcMaxLength, sgcRange e sgcPattern emitem as restrições de schema correspondentes para que as mesmas regras apareçam na especificação gerada e sejam aplicadas em tempo de execução.

Especificações e referências

Fontes oficiais para os protocolos e formatos que este componente implementa.

Documentação e Demos

Acesse diretamente a referência do componente, baixe os projetos de demonstração prontos para executar e obtenha a versão de avaliação.

Ajuda online — Servidor OpenAPI Referência completa de propriedades, métodos e eventos deste componente.
Projetos de demonstração — Demos\23.OpenAPI Dois exemplos prontos para executar: spec-first (JSON do Petstore) e code-first (gerenciador de tarefas). Acompanham o pacote sgcWebSockets — baixe a versão de avaliação abaixo.
Manual do usuário (PDF) Manual abrangente cobrindo todos os componentes da biblioteca.

Pronto para colocar no ar uma API REST documentada?

Baixe a versão de avaliação gratuita e transforme uma especificação OpenAPI em um servidor Delphi em execução — com Swagger UI incluído.