OpenAPI 服务器

直接在 Delphi HTTP 服务器内托管 OpenAPI 3 REST API。支持规范优先或代码优先模式,自动 Swagger UI、请求验证和 CORS — 规范成为唯一的事实来源。

TsgcWSAPIServer_OpenAPI

即插即用的 API 服务器,可接入 TsgcWebSocketHTTPServer,加载 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 页面。

规范优先模式

使用 LoadFromFileLoadFromString 加载现有的 OpenAPI 3 文档。路由、参数和模式将被解析,成为服务器必须遵守的契约 — 修改 JSON、重启、完成。

代码优先模式

使用 sgcHttpGet / sgcRoute / sgcFromPath / sgcResponse 属性注解 Pascal 类;TsgcOpenAPICodeFirstScanner 遍历 RTTI 并在运行时生成规范 — 无需手写 JSON。

内置 Swagger UI

开启 OpenAPIOptions.Endpoint.ServeSwaggerUI,服务器即可在 /docs 发布交互式 try-it-out 页面,由 /openapi.json 提供数据 — 无需单独构建文档,无需静态导出。

请求验证

根据规范中的模式验证请求体、查询字符串、路径参数和必填字段。验证失败时,OnValidationError 提供完整错误列表和 Continue 标志以选择拒绝或继续。

CORS

设置 OpenAPIOptions.CORS.Enabled := True,服务器即可在每个路由上响应预检 OPTIONS 请求,并应用您的 AllowOrigins / AllowHeaders / AllowMethods 策略。

上下文助手

TsgcOpenAPIServerContext 暴露 PathParamAs*QueryParamAs*HeaderValueBodyAsString / BodyAsJSON,以及 RespondJSON 和符合 RFC 7807 风格的 RespondError

管道事件

OnBeforeRequestOnAfterRequestOnAuthenticateOnException 包裹主 OnRequest 处理器 — 无需继承即可短路、记录、认证或重新映射异常。

基础路径前缀

OpenAPIOptions.Endpoint.BasePath 为每个路由以及内置的 /openapi.json/docs 端点添加前缀,使 API 可以位于 /api/v1 或您喜欢的任何命名空间之下。

验证属性(代码优先)

sgcRequiredsgcMinLengthsgcMaxLengthsgcRangesgcPattern 会生成匹配的模式约束,因此相同的规则会出现在生成的规范中,并在运行时被强制执行。

规范与参考

本组件所实现的协议与格式的权威来源。

文档与演示

深度链接至组件参考,获取开箱即用的演示项目,并下载试用版。

在线帮助 — OpenAPI 服务器 该组件的完整属性、方法和事件参考。
演示项目 — Demos\23.OpenAPI 两个开箱即用的示例:规范优先(Petstore JSON)和代码优先(任务管理器)。包含在 sgcWebSockets 安装包中 — 请在下方下载试用版。
用户手册(PDF) 涵盖库中每个组件的全面手册。

准备好发布一个有文档的 REST API 了吗?

下载免费试用版,把 OpenAPI 规范变成可运行的 Delphi 服务器 — 内置 Swagger UI。