OpenAPI Server

Hostuj REST API zgodne z OpenAPI 3 bezpośrednio w serwerze HTTP Delphi. Tryb spec-first lub code-first, z automatycznym Swagger UI, walidacją żądań i CORS — specyfikacja staje się jedynym źródłem prawdy.

TsgcWSAPIServer_OpenAPI

Gotowy do użycia serwer API, który podłącza się do TsgcWebSocketHTTPServer, ładuje specyfikację OpenAPI 3 (lub generuje ją z adnotowanych klas Pascala) i kieruje przychodzące żądania według operationId.

Klasa komponentu

TsgcWSAPIServer_OpenAPI

Specyfikacja

OpenAPI 3.0

Platformy

Windows, macOS, Linux, iOS, Android

Edycja

Enterprise

Spec-first lub code-first — trzy linie w obu przypadkach

Utwórz komponent, załaduj (lub wygeneruj) specyfikację i podłącz ją do serwera HTTP. Komponent dopasuje trasy, zwaliduje dane wejściowe i automatycznie udostępni Swagger UI pod adresem /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;

Co jest w środku

Dwa sposoby definiowania API, cztery punkty zaczepienia w potoku, walidacja względem specyfikacji i strona Swagger UI udostępniana przez sam komponent.

Tryb spec-first

Załaduj istniejący dokument OpenAPI 3 za pomocą LoadFromFile lub LoadFromString. Trasy, parametry i schematy są parsowane i stają się kontraktem, który serwer musi spełniać — zmień JSON, zrestartuj, gotowe.

Tryb code-first

Adnotuj klasy Pascala atrybutami sgcHttpGet / sgcRoute / sgcFromPath / sgcResponse; TsgcOpenAPICodeFirstScanner przechodzi przez RTTI i emituje specyfikację w czasie wykonania — bez ręcznego pisania JSON-a.

Wbudowany Swagger UI

Włącz OpenAPIOptions.Endpoint.ServeSwaggerUI, a serwer opublikuje interaktywną stronę try-it-out pod adresem /docs, zasilaną przez /openapi.json — bez osobnego budowania dokumentacji ani statycznego eksportu.

Walidacja żądań

Waliduje treść, query string, parametry ścieżki i pola wymagane względem schematów ze specyfikacji. W razie niepowodzenia OnValidationError daje pełną listę błędów oraz flagę Continue pozwalającą odrzucić lub kontynuować obsługę.

CORS

Ustaw OpenAPIOptions.CORS.Enabled := True, a serwer odpowie na żądania preflight OPTIONS na każdej trasie, stosując Twoje zasady AllowOrigins / AllowHeaders / AllowMethods.

Pomocniki kontekstu

TsgcOpenAPIServerContext udostępnia PathParamAs*, QueryParamAs*, HeaderValue, BodyAsString / BodyAsJSON oraz RespondJSON i metodę RespondError w stylu RFC 7807.

Zdarzenia potoku

OnBeforeRequest, OnAfterRequest, OnAuthenticate i OnException opakowują główny obsługiwacz OnRequest — pozwalają przerwać przetwarzanie, logować, uwierzytelniać lub przemapowywać wyjątki bez tworzenia podklas.

Prefiks ścieżki bazowej

OpenAPIOptions.Endpoint.BasePath dodaje prefiks do każdej trasy oraz do wbudowanych punktów końcowych /openapi.json i /docs, dzięki czemu API może być dostępne pod /api/v1 lub dowolną inną przestrzenią nazw.

Atrybuty walidacji (code-first)

sgcRequired, sgcMinLength, sgcMaxLength, sgcRange i sgcPattern emitują odpowiadające im ograniczenia schematu, dzięki czemu te same reguły pojawiają się w wygenerowanej specyfikacji i są egzekwowane w czasie wykonania.

Specyfikacje i odniesienia

Autorytatywne źródła protokołów i formatów implementowanych przez ten komponent.

Dokumentacja i dema

Przejdź bezpośrednio do dokumentacji komponentu, pobierz gotowe do uruchomienia projekty demonstracyjne oraz wersję próbną.

Pomoc online — Serwer OpenAPI Pełna dokumentacja właściwości, metod i zdarzeń tego komponentu.
Projekty demonstracyjne — Demos\23.OpenAPI Dwa gotowe do uruchomienia przykłady: spec-first (Petstore JSON) i code-first (menedżer zadań). Dostarczane w pakiecie sgcWebSockets — pobierz wersję próbną poniżej.
Podręcznik użytkownika (PDF) Kompleksowy podręcznik obejmujący każdy komponent biblioteki.

Gotowy do uruchomienia udokumentowanego REST API?

Pobierz bezpłatną wersję próbną i zamień specyfikację OpenAPI w działający serwer Delphi — ze Swagger UI w komplecie.