OpenAPI 서버

Delphi HTTP 서버 안에서 직접 OpenAPI 3 REST API를 호스팅하세요. 스펙 우선 또는 코드 우선 방식, 자동 Swagger UI, 요청 검증과 CORS를 갖추고 있으며 — 스펙이 단일 진실 공급원이 돼요.

TsgcWSAPIServer_OpenAPI

TsgcWebSocketHTTPServer에 꽂아 쓰는 드롭인 API 서버로, OpenAPI 3 스펙을 로드하거나(또는 어노테이션이 붙은 Pascal 클래스에서 생성한 뒤) 들어오는 요청을 operationId 기준으로 디스패치해요.

컴포넌트 클래스

TsgcWSAPIServer_OpenAPI

명세

OpenAPI 3.0

플랫폼

Windows, macOS, Linux, iOS, Android

에디션

Enterprise

스펙 우선이든 코드 우선이든 — 어느 쪽이든 세 줄

컴포넌트를 만들고, 스펙을 로드(또는 생성)한 다음 HTTP 서버에 붙이세요. 컴포넌트가 라우트를 매칭하고, 입력을 검증하며, /docs에서 Swagger UI를 자동으로 제공해요.

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;

내부 구성

API를 정의하는 두 가지 방법, 네 가지 파이프라인 훅, 스펙 기반 검증, 그리고 컴포넌트가 직접 제공하는 Swagger UI 페이지를 갖추고 있어요.

스펙 우선 모드

LoadFromFile 또는 LoadFromString으로 기존 OpenAPI 3 문서를 로드하세요. 라우트, 파라미터, 스키마가 파싱되어 서버가 지켜야 할 계약이 돼요 — JSON을 바꾸고 재시작하면 끝이에요.

코드 우선 모드

Pascal 클래스에 sgcHttpGet / sgcRoute / sgcFromPath / sgcResponse 어트리뷰트를 달면, TsgcOpenAPICodeFirstScanner가 RTTI를 훑어서 런타임에 스펙을 만들어 줘요 — 직접 작성할 JSON이 없어요.

내장 Swagger UI

OpenAPIOptions.Endpoint.ServeSwaggerUI를 켜면 서버가 /openapi.json으로 공급되는 대화형 try-it-out 페이지를 /docs에 게시해요 — 별도의 문서 빌드도, 정적 내보내기도 필요 없어요.

요청 검증

본문, 쿼리 문자열, 경로 파라미터, 필수 필드를 스펙의 스키마에 대해 검증해요. 실패 시 OnValidationError가 전체 에러 목록과 거부할지 진행할지 결정하는 Continue 플래그를 제공해요.

CORS

OpenAPIOptions.CORS.Enabled := True로 설정하면 서버가 모든 라우트에서 프리플라이트 OPTIONS에 응답하며, AllowOrigins / AllowHeaders / AllowMethods 정책을 적용해요.

컨텍스트 헬퍼

TsgcOpenAPIServerContextPathParamAs*, QueryParamAs*, HeaderValue, BodyAsString / BodyAsJSON은 물론 RespondJSON과 RFC 7807 스타일의 RespondError도 노출해요.

파이프라인 이벤트

OnBeforeRequest, OnAfterRequest, OnAuthenticate, OnException이 메인 OnRequest 핸들러를 감싸 줘요 — 서브클래싱 없이 단락(short-circuit), 로깅, 인증, 예외 리매핑이 가능해요.

베이스 경로 접두사

OpenAPIOptions.Endpoint.BasePath는 모든 라우트와 내장 /openapi.json & /docs 엔드포인트 앞에 접두사를 붙여 줘요. 그래서 API를 /api/v1이나 원하는 네임스페이스 뒤에 둘 수 있어요.

검증 어트리뷰트 (코드 우선)

sgcRequired, sgcMinLength, sgcMaxLength, sgcRange, sgcPattern이 그에 맞는 스키마 제약을 내보내, 동일한 규칙이 생성된 스펙에 표시되고 런타임에도 강제돼요.

명세 & 참고 자료

이 컴포넌트가 구현하는 프로토콜과 포맷의 공식 출처예요.

문서 & 데모

컴포넌트 레퍼런스로 바로 이동하고, 바로 실행 가능한 데모 프로젝트를 받고, 체험판을 다운로드하세요.

온라인 도움말 — OpenAPI 서버 이 컴포넌트의 속성, 메서드, 이벤트 전체 레퍼런스예요.
데모 프로젝트 — Demos\23.OpenAPI 바로 실행 가능한 두 가지 예제예요: 스펙 우선(Petstore JSON)과 코드 우선(태스크 매니저). sgcWebSockets 패키지에 포함되어 있어요 — 아래에서 체험판을 받으세요.
사용자 매뉴얼 (PDF) 라이브러리의 모든 컴포넌트를 다루는 종합 매뉴얼이에요.

문서화된 REST API를 출시할 준비가 되셨나요?

무료 체험판을 다운로드하고 OpenAPI 스펙을 실행 중인 Delphi 서버로 바꿔 보세요 — Swagger UI도 포함이에요.