sgcOpenAPI 五分钟上手

sgcOpenAPI 是代码生成器,而不是组件面板上的组件。您把它指向一个规范,它会写出一个 Pascal 单元,然后您在项目中调用该单元。本页运行一次生成器,然后针对生成的客户端发出一次真实调用。

OpenAPI 3,JSON 和 YAML
生成类型化的 Delphi 客户端或服务器存根
仅限 Delphi,类型化响应需要 XE7 及更高版本

没有需要放置的组件

这是开始之前需要理解的唯一一件事。sgcOpenAPI 不会在 IDE 组件面板上注册任何内容,也不附带设计时包。工作流程是先生成,再使用。

工具

sgcOpenAPI.exe,它既是图形界面向导,也是命令行。它读取一个规范并写出一个 .pas 文件。

它写出什么

一个单元,其中包含派生自 TsgcOpenAPI_Client 的客户端类、每个操作对应的一个方法、请求类和响应类,以及一个返回现成单例的 GetOpenAPIClient 函数。

如何调用

把生成的单元添加到项目中,放入 uses 子句,然后调用 GetOpenAPIClient.YourOperation(...)。结果是一个响应对象,用完后由您释放。

包

附带五个运行时包,其中包含适用于 AWS、Azure、Google 和 Microsoft 的预构建 SDK。它们用于编译,而不是安装,因为没有需要添加的组件面板页。

要求与版本

版本列给出的是控制代码的定义,以及它在产品自己的 Source/sgcVer.inc 中所在的行号。

项目 值
IDE 生成的代码支持 Delphi 7 到 RAD Studio 13。类型化的响应对象需要 XE7 或更高版本,随包附带的演示用 {$IF CompilerVersion >= 28.0} 对它们进行保护。低于该版本时,生成的方法返回普通字符串。
C++Builder 不支持生成的客户端。控制整个 sgcHTTP_OpenAPI_Client.pas 的 SGC_HTTP_OPENAPI 定义在产品的 sgcVer.inc 第 702 行的 {$IFNDEF BCB} 之内,因此 C++Builder 构建会把该单元编译成空。
版本 sgcOpenAPI 构建固定在最低的两个层级。其 sgcVer.inc 第 7 行到第 10 行依次是 {$IFDEF SGC_OPENAPI},然后是 {$UNDEF SGC_EDT_PRO}、{$UNDEF SGC_EDT_ENT} 和 {$UNDEF SGC_EDT_ALL},只保留 Core 和 Standard 的定义。商业层级按席位数量划分,而不是按功能划分。
服务器生成 同一个构建在第 11 行定义了 SGC_HTTP_OPENAPI_SERVER,因此生成器除了客户端之外,还可以生成服务器存根。请在命令行上传入 -s。
平台 没有单元级操作系统保护。生成的客户端基础单元中唯一的条件只有常见的 {$IFDEF MSWINDOWS} 引入和线程 ID 类型替换,因此 Windows、macOS、Linux、Android 和 iOS 都能编译。
许可证激活 如果这台机器尚未激活,请在命令行上传入 -user 和 -password,否则运行会以代码 2 退出。

生成器接受 JSON 和 YAML,并且都在本地读取。Swagger 2.0 文档同样在本地转换为 OpenAPI 3。远程转换器需要通过 -r 主动启用,并且会把您的规范上传到第三方服务器,因此除非您要求,否则它保持关闭。

安装并生成

没有需要安装的设计时包,因此安装过程比其他产品更短。

1. 解压

将下载文件解压到一个文件夹,下文称之为 {$DIR}。您会得到 Demos\、Bin\ 和 Source\。

2. 库路径

依次选择 Tools、Options、Library。添加 {$DIR}\Source,以便解析生成的单元和客户端基类。无需向 IDE 中安装任何东西。

3. 可选,编译预构建的 SDK

如果您想使用其中某个捆绑的 SDK,请在 {$DIR}\Packages\ 下打开相应的运行时包并编译它。这些是运行时包,因此是编译而不是安装。

4. 生成客户端

运行 Bin\sgcOpenAPI.exe 使用向导,或者使用命令行。一个输入,一个输出,您就得到了一个单元。

5. 把单元添加到项目中

把生成的 .pas 放在您的其他单元旁边,将其添加到项目中,并放入 uses 子句。这就是全部的集成工作。

输入规范,输出可用的客户端

一条命令行生成单元,一次调用使用它。第三个选项卡展示了第一天值得了解的开关。

command line
> sgcOpenAPI.exe -i "geolocation.json" -o "geolocation.pas"

File successfully created geolocation.pas

两个开关都是必需的。-i 接受本地文件或 URL,支持 JSON 和 YAML,-o 是要写出的 Pascal 单元。同一个可执行文件中还有图形界面向导,如果您更喜欢点击操作的话。把生成的 .pas 添加到项目中,即可使用。

fGeolocation.pas
uses
  geolocation;   // the unit you just generated

procedure TfrmGeolocation.btnGeolocationClick(Sender: TObject);
var
  oResponse: TsgcOpenAPI_Retrieve_the_location_of_an_IP_address_Response;
begin
  oResponse := GetOpenAPIClient.Retrieve_the_location_of_an_IP_address(
    txtAPIKey.Text, txtIPAddress.Text);
  try
    if oResponse.IsSuccessful then
      memoResponse.Lines.Text :=
        'country: ' + oResponse.Successful.Country + #13#10 +
        'city: ' + oResponse.Successful.City
    else
      memoResponse.Lines.Text := oResponse.ResponseError;
  finally
    oResponse.Free;
  end;
end;

GetOpenAPIClient 是生成到单元中的,不带任何参数。每个操作对应一个方法,名称取自操作 ID。响应对象需要由您释放,这就是演示使用 try finally 的原因。在 XE7 之前的 Delphi 版本上,生成的方法改为返回普通字符串,随包附带的演示用 {$IF CompilerVersion >= 28.0} 保护类型化路径。

command line
-s              generate a server stub instead of a client
-a 3            add an OAuth2 flow to the generated client
                (0 none, 1 basic, 2 token, 3 oauth2, 4 jwt)
-u <url>        set the base url the generated client uses
-m 1            name methods from summary rather than operationid
                (0 operationid, 1 summary, 2 endpoint)
-x <list|file>  exclude operations, as "VERB endpoint"
-p              generate only the classes the kept operations use
-nc             do not create pascal classes
-l              show progress messages (errors are always shown)
-user -password activate the licence on this machine

对于大型规范,同时使用 -x 和 -p,决定了生成的单元是能在 IDE 中打开,还是无法打开。同样存在 -r,它被有意设为默认关闭,因为它会把整个规范上传到第三方转换器。

生成命令是工具自带帮助所打印的用法行。调用部分来自随包附带的演示 Demos\20.Client\abstractapi.com\geolocation\fGeolocation.pas,其中的窗体控件已替换为字面量。该演示附带规范,并期望您自己生成单元,这就是快速入门从生成器开始的原因。

检查生成器是否成功

有两样东西可以查看,其中一样可以通过脚本检查。

消息

工具会打印 File successfully created,后面跟着输出路径。错误始终输出到标准错误,因此一次没有写出任何内容的静默运行并不是真正的静默。

退出代码

0 成功,1 错误,2 许可证无效,3 开关无效,4 配置文件无效,5 输入文件无效,6 输出文件无效,7 规范无法转换为有效的 OpenAPI 3 文档。请在您的构建脚本中检查它。

单元可以编译

把生成的 .pas 添加到项目中并构建。它应该只依赖库路径上的 {$DIR}\Source 就能编译通过。

IsSuccessful

在运行时,响应对象会告诉您结果。当它为 false 时,ResponseError 携带消息,ResponseCode 携带 HTTP 状态。

第一次通常会出什么问题

六个问题几乎涵盖了所有首次运行的情况。

您在组件面板上寻找组件

没有这样的组件。sgcOpenAPI 不注册任何组件,也不附带设计时包。生成的单元就是集成点,GetOpenAPIClient 是您访问客户端的方式。

演示中提到的单元不存在

这是预期的。演示附带的是规范,而不是生成的单元,因此您需要先运行生成器。地理位置演示需要一个名为 geolocation 的单元,它由 geolocation.json 生成。

退出代码 2

这台机器上的许可证尚未激活。请在命令行上传入 -user 和 -password。

类型化的响应对象无法编译

类型化响应需要 XE7 或更高版本。随包附带的演示用 {$IF CompilerVersion >= 28.0} 保护它们,并在较旧的编译器上回退到返回普通字符串的方法。如果您需要支持 Delphi 7,请保留该保护。

在 C++Builder 下什么都无法编译

SGC_HTTP_OPENAPI 定义在产品的 sgcVer.inc 第 702 行的 {$IFNDEF BCB} 之内,因此生成的客户端基类根本不会为 C++Builder 编译。

规范无法转换

退出代码 7 表示该文档无法转换为有效的 OpenAPI 3 文档。YAML 和 Swagger 2.0 在本地处理;-r 背后的远程转换器是最后的退路,它会把整个文件上传到 eSeGeCe 无法控制的服务器。

第一个客户端之后

四个方向,都来自同一个生成器。

生成服务器,而不是客户端

传入 -s,生成器就会改为生成服务器存根。服务器演示展示了生成的操作是如何被调度并按规范进行验证的。

sgcOpenAPI Server

使用预构建的 SDK

已经生成并附带了一千多个规范,包括 AWS、Azure、Google 和 Microsoft。编译您想要的包,就可以完全跳过生成步骤。

捆绑的 API

精简您生成的内容

-x 按动词和端点排除操作,-p 会修剪不再被任何剩余操作使用的类。对于大型规范,这决定了生成的单元是能打开,还是无法打开。

解析器

接入身份验证

生成的客户端带有 Authentication 属性,-a 在生成时选择方案:无、基本、令牌、OAuth2 或 JWT。

sgcOpenAPI 功能

参考、演示和文档

演示项目包含在下载包内,位于 Demos\ 下:预构建的 SDK、一个生成的客户端和两个服务器示例。

sgcOpenAPI 的功能 解析器、生成器和服务器组件,合在一个页面中。
解析器 规范是如何被读取、验证并转换为 Pascal 类型的。
服务器组件 根据规范提供 API 服务,而不是使用 API。
捆绑的 API 随包附带、可直接编译的预构建 SDK。
下载试用版 生成器和源代码,有时间限制。
什么是 OpenAPI 背景知识,适合不熟悉规范格式本身的读者。

相关阅读:从 OpenAPI 生成 Delphi 客户端、打包架构、sgcOpenAPI 与 swagger-codegen 的比较以及 OpenAPI 服务器。每个产品都有自己的快速入门,列在入门页面上。

sgcOpenAPI 快速入门常见问题

没有。sgcOpenAPI 是代码生成器和运行时库,不会在 IDE 组件面板上注册任何内容。产品中根本没有设计时包。您针对一个规范运行 sgcOpenAPI.exe,它会写出一个 Pascal 单元,然后您把该单元添加到项目中。在其中,GetOpenAPIClient 返回一个现成的客户端对象,每个操作对应一个方法。
工具在自己的帮助中会打印它:sgcOpenAPI.exe -i "c:\openapi.json" -o "c:\openapi.pas"。两个开关都是必需的。-i 接受本地文件或 URL,JSON 和 YAML 都支持。-o 是要写出的 Pascal 单元。值也可以用冒号附加在后面,例如 -i:"c:\openapi.json"。
有两种方式。工具会打印 File successfully created,后面跟着输出路径,并且会设置一个您可以在构建脚本中检查的退出代码。代码含义为:0 成功,1 错误,2 许可证无效,3 开关无效,4 配置文件无效,5 输入文件无效,6 输出文件无效,7 规范无法转换为有效的 OpenAPI 3 文档。错误始终输出到标准错误。
生成的方法返回一个派生自 TsgcOpenAPIResponse 的响应对象。请先读取 IsSuccessful。当它为 false 时,ResponseError 携带消息,ResponseCode 携带 HTTP 状态。用完响应对象后请释放它,随包附带的演示是在 try finally 中完成的。
生成的客户端不能。包裹 sgcHTTP_OpenAPI_Client.pas 整个接口部分的 SGC_HTTP_OPENAPI,定义在产品的 sgcVer.inc 第 702 行的 {$IFNDEF BCB} 之内,因此在 C++Builder 下该单元会编译成空,生成的代码也就没有基类。请为 Delphi 生成。
生成的代码面向 Delphi 7 及更高版本。类型化的响应对象需要 XE7 或更高版本,随包附带的演示用 {$IF CompilerVersion >= 28.0} 明确了这一点:在该界线之上,您得到带有类型化字段的响应对象;在其之下,同一个方法返回普通字符串。如果您的项目必须在两者上都能构建,请保留该保护。
可以。传入 -s,生成器就会生成带有代码优先特性的服务器存根,而不是客户端。作为 sgcOpenAPI 发布的构建在其 sgcVer.inc 第 11 行定义了 SGC_HTTP_OPENAPI_SERVER,因此每种许可证都包含服务器端。Demos\30.Server 下附带两个服务器演示。
除非您要求,否则不会。YAML 在本地读取,Swagger 2.0 文档也在本地转换为 OpenAPI 3。默认关闭的 -r 开关允许回退到 converter.swagger.io 上的公共转换器,帮助文本明确指出,这会把完整的文件上传到 eSeGeCe 无法控制的服务器。对于任何机密内容,请保持关闭。
超值之选:All-AccesseSeGeCe 全部产品,含高级支持,每年 €1,059 起。
查看 All-Access 价格

准备好不再手写 REST 客户端了吗?

下载试用版,并根据您已有的规范生成一个客户端。