通过 sgcOpenAPI 获得 GitHub REST API Delphi 客户端

GitHub 维护着公开可用的最大 OpenAPI 描述——超过 1,000 个端点,涵盖仓库、议题、拉取请求、Actions、检查、包和 GraphQL 网关。将其输入 sgcOpenAPI,即可生成一个类型化的 Delphi 单元,您的应用程序可以使用它来驱动 REST API 公开的任何 GitHub 工作流。

GitHub + sgcOpenAPI

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_ReposTsgcGitHub_IssuesTsgcGitHub_PullsTsgcGitHub_ActionsTsgcGitHub_ChecksTsgcGitHub_PackagesTsgcGitHub_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 描述中的每个标签都成为一个类型化类。每个有文档记录的参数都成为类型化参数。

仓库与内容

ReposGitContentsBranchesTagsReleasesForks。读取、写入和删除文件。创建分支、管理保护规则、起草和发布发行版。

议题与拉取请求

IssuesPullsReviewsCommentsReactionsLabelsMilestonesAssignees。完整的协作界面。

Actions 与检查

ActionsWorkflowRunsWorkflowJobsArtifactsSecretsVariablesChecksCheckRunsCheckSuites——基于 GitHub Actions 数据构建仪表板或运行自动化。

包与容器注册表

PackagesPackageVersions——从 Delphi 管理 npm、NuGet、Maven、RubyGems 和容器包。

组织与团队

OrgsTeamsMembersMembershipsOrgsAdmin 用于仅限所有者的操作,如 SCIM 配置。

GitHub Apps

AppsInstallationsAppManifests——以编程方式安装 GitHub Apps 并铸造短期安装令牌。

三件需要注意的事情

速率限制和条件请求

GitHub 强制执行每小时速率限制(带令牌时为 5,000 次请求/小时,未认证时为 60 次)。生成的客户端为每个 GET 响应存储最后一个 ETag——通过在下次调用时设置 IfNoneMatch 重用它们,以获得免费的 304 响应。

GitHub Apps 需要短期令牌

对于 GitHub App 安装,您需要用 JWT(用您应用的私钥签名)交换一个 1 小时的安装令牌。使用 Apps.CreateInstallationAccessToken 方法并在令牌过期前刷新它。

多态时间线事件

Issues.ListEventsForTimeline 端点返回数十种事件类型的判别联合。生成的单元发出一个基类和每个变体一个后代——根据 Event 属性进行向下转型。

来自博客

OpenAPI Delphi 解析器

底层解析器如何处理现实世界中的 OpenAPI 3.x 规范。

阅读文章 →

OpenAPI 客户端 + 解析器

介绍客户端包装器和解析器内部机制的配套博客文章。

阅读文章 →

sgcOpenAPI 2026.6

最新发行说明——新的生成器选项和解析器修复。

阅读文章 →

今天就构建您的 GitHub 自动化

sgcOpenAPI 随附解析器、代码生成器、OpenAPI 服务器以及 Amazon、Google、Microsoft 和 Azure SDK 包——一个产品,三个层级。