通过 sgcOpenAPI 获得 GitHub REST API Delphi 客户端
GitHub 维护着公开可用的最大 OpenAPI 描述——超过 1,000 个端点,涵盖仓库、议题、拉取请求、Actions、检查、包和 GraphQL 网关。将其输入 sgcOpenAPI,即可生成一个类型化的 Delphi 单元,您的应用程序可以使用它来驱动 REST API 公开的任何 GitHub 工作流。
GitHub 维护着公开可用的最大 OpenAPI 描述——超过 1,000 个端点,涵盖仓库、议题、拉取请求、Actions、检查、包和 GraphQL 网关。将其输入 sgcOpenAPI,即可生成一个类型化的 Delphi 单元,您的应用程序可以使用它来驱动 REST API 公开的任何 GitHub 工作流。
GitHub 在 MIT 许可证下提供完全维护的 OpenAPI 3 描述。sgcOpenAPI 解析它并生成一个可在 Delphi 7 到 RAD Studio 13 上编译的 Pascal 单元。
个人访问令牌、GitHub App JWT、OAuth
sgcOpenAPI_GitHub
Windows、macOS、Linux、iOS、Android
GitHub 发布两种风味的规范——api.github.com.json 用于公共托管服务,ghes-3.x.json 用于 GitHub Enterprise Server。将解析器指向您的目标版本。
uses sgcOpenAPI_Parser, sgcOpenAPI_Generator; var vParser: TsgcOpenAPIParser; vGen: TsgcOpenAPIGenerator; begin vParser := TsgcOpenAPIParser.Create(nil); try vParser.LoadFromFile('C:\specs\github\api.github.com.json'); Memo1.Lines.Add(Format('GitHub spec: %d paths, %d schemas', [vParser.Paths.Count, vParser.Schemas.Count])); vGen := TsgcOpenAPIGenerator.Create(nil); try vGen.Parser := vParser; vGen.OutputUnit := 'sgcOpenAPI_GitHub'; vGen.OutputFolder := 'C:\Generated\GitHub'; vGen.GroupBy := gbTag; // one class per tag vGen.Generate; finally vGen.Free; end; finally vParser.Free; end; end;
生成器为每个 GitHub 标签发出一个类——TsgcGitHub_Repos、TsgcGitHub_Issues、TsgcGitHub_Pulls、TsgcGitHub_Actions、TsgcGitHub_Checks、TsgcGitHub_Packages、TsgcGitHub_OrgsAdmin 等——所有这些都由顶层 TsgcGitHub 门面拥有。
使用个人访问令牌进行身份验证,然后枚举当前用户的仓库。分页由生成的可枚举包装器处理——只需对结果使用 for...in,客户端会按需获取其他页。
uses sgcOpenAPI_GitHub; var vGH: TsgcGitHub; vRepo: TsgcGitHubRepository; begin vGH := TsgcGitHub.Create(nil); try vGH.Token := 'ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxx'; vGH.UserAgent := 'sgcDelphi/1.0'; for vRepo in vGH.Repos.ListForAuthenticatedUser( Visibility := 'private', PerPage := 100) do begin Memo1.Lines.Add(Format('%s — %s', [vRepo.FullName, vRepo.Description])); end; finally vGH.Free; end; end;
两次简短调用——一个修改,一个读取。两个路由都返回规范描述的相同强类型对象。
// Create an issue in repo "octocat/Hello-World" var vIssue: TsgcGitHubIssue; begin vIssue := vGH.Issues.Create( Owner := 'octocat', Repo := 'Hello-World', Title := 'Memory leak in HTTP/2 reader', Body := 'Repro steps: ...', Labels := ['bug', 'http2']); ShowMessage('Filed issue #' + IntToStr(vIssue.Number)); // List open PRs and inspect the head ref for vPR in vGH.Pulls.List( Owner := 'octocat', Repo := 'Hello-World', State := 'open', Sort := 'updated') do begin Memo1.Lines.Add(Format('PR #%d %s — %s', [vPR.Number, vPR.Title, vPR.Head.Ref])); end; end;
官方 OpenAPI 描述中的每个标签都成为一个类型化类。每个有文档记录的参数都成为类型化参数。
Repos、Git、Contents、Branches、Tags、Releases、Forks。读取、写入和删除文件。创建分支、管理保护规则、起草和发布发行版。
Issues、Pulls、Reviews、Comments、Reactions、Labels、Milestones、Assignees。完整的协作界面。
Actions、WorkflowRuns、WorkflowJobs、Artifacts、Secrets、Variables、Checks、CheckRuns、CheckSuites——基于 GitHub Actions 数据构建仪表板或运行自动化。
Packages、PackageVersions——从 Delphi 管理 npm、NuGet、Maven、RubyGems 和容器包。
Orgs、Teams、Members、Memberships、OrgsAdmin 用于仅限所有者的操作,如 SCIM 配置。
Apps、Installations、AppManifests——以编程方式安装 GitHub Apps 并铸造短期安装令牌。
GitHub 强制执行每小时速率限制(带令牌时为 5,000 次请求/小时,未认证时为 60 次)。生成的客户端为每个 GET 响应存储最后一个 ETag——通过在下次调用时设置 IfNoneMatch 重用它们,以获得免费的 304 响应。
对于 GitHub App 安装,您需要用 JWT(用您应用的私钥签名)交换一个 1 小时的安装令牌。使用 Apps.CreateInstallationAccessToken 方法并在令牌过期前刷新它。
Issues.ListEventsForTimeline 端点返回数十种事件类型的判别联合。生成的单元发出一个基类和每个变体一个后代——根据 Event 属性进行向下转型。