OpenAPI 服务器
直接在 Delphi HTTP 服务器内托管 OpenAPI 3 REST API。支持规范优先或代码优先模式,自动 Swagger UI、请求验证和 CORS — 规范成为唯一的事实来源。
直接在 Delphi HTTP 服务器内托管 OpenAPI 3 REST API。支持规范优先或代码优先模式,自动 Swagger UI、请求验证和 CORS — 规范成为唯一的事实来源。
即插即用的 API 服务器,可接入 TsgcWebSocketHTTPServer,加载 OpenAPI 3 规范(或从带注解的 Pascal 类生成规范),并按 operationId 分发传入请求。
创建组件、加载(或生成)规范、附加到 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、重启、完成。
使用 sgcHttpGet / sgcRoute / sgcFromPath / sgcResponse 属性注解 Pascal 类;TsgcOpenAPICodeFirstScanner 遍历 RTTI 并在运行时生成规范 — 无需手写 JSON。
开启 OpenAPIOptions.Endpoint.ServeSwaggerUI,服务器即可在 /docs 发布交互式 try-it-out 页面,由 /openapi.json 提供数据 — 无需单独构建文档,无需静态导出。
根据规范中的模式验证请求体、查询字符串、路径参数和必填字段。验证失败时,OnValidationError 提供完整错误列表和 Continue 标志以选择拒绝或继续。
设置 OpenAPIOptions.CORS.Enabled := True,服务器即可在每个路由上响应预检 OPTIONS 请求,并应用您的 AllowOrigins / AllowHeaders / AllowMethods 策略。
TsgcOpenAPIServerContext 暴露 PathParamAs*、QueryParamAs*、HeaderValue、BodyAsString / BodyAsJSON,以及 RespondJSON 和符合 RFC 7807 风格的 RespondError。
OnBeforeRequest、OnAfterRequest、OnAuthenticate 和 OnException 包裹主 OnRequest 处理器 — 无需继承即可短路、记录、认证或重新映射异常。
OpenAPIOptions.Endpoint.BasePath 为每个路由以及内置的 /openapi.json 和 /docs 端点添加前缀,使 API 可以位于 /api/v1 或您喜欢的任何命名空间之下。
sgcRequired、sgcMinLength、sgcMaxLength、sgcRange 和 sgcPattern 会生成匹配的模式约束,因此相同的规则会出现在生成的规范中,并在运行时被强制执行。
本组件所实现的协议与格式的权威来源。