GitHub REST API Delphi-client via sgcOpenAPI

GitHub onderhoudt de grootste publiek beschikbare OpenAPI-beschrijving — meer dan 1.000 endpoints over repositories, issues, pull requests, actions, checks, packages en de GraphQL-gateway. Voer hem in sgcOpenAPI en lever een typed Delphi-unit op die je applicatie kan gebruiken om elke GitHub-workflow aan te sturen die de REST-API blootstelt.

GitHub + sgcOpenAPI

GitHub levert een volledig onderhouden OpenAPI 3-beschrijving onder de MIT-licentie. sgcOpenAPI parset hem en levert een enkele Pascal-unit op die compileert op Delphi 7 t/m RAD Studio 13.

Auth

Personal access token, GitHub App JWT, OAuth

Gegenereerde unit

sgcOpenAPI_GitHub

Platforms

Windows, macOS, Linux, iOS, Android

Genereer de client

GitHub publiceert twee smaken van de spec — api.github.com.json voor de publieke hosted service en ghes-3.x.json voor GitHub Enterprise Server. Wijs de parser naar degene die je target.

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;

De generator levert een klasse per GitHub-tag op — TsgcGitHub_Repos, TsgcGitHub_Issues, TsgcGitHub_Pulls, TsgcGitHub_Actions, TsgcGitHub_Checks, TsgcGitHub_Packages, TsgcGitHub_OrgsAdmin enzovoort — allemaal in bezit van een top-level TsgcGitHub-facade.

Lijst repositories op

Authenticeer met een personal access token, en tel dan de repositories van de huidige gebruiker op. Paginering wordt afgehandeld door de gegenereerde enumerable wrapper — doe gewoon for...in over het resultaat en de client haalt aanvullende pagina’s op afroep op.

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;

Maak een issue en bekijk een pull request

Twee korte aanroepen — een muterend, een lezend. Beide routes geven dezelfde sterk getypeerde objecten terug die de spec beschrijft.

// 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;

Wat de gegenereerde unit je geeft

Elke tag in de officiele OpenAPI-beschrijving wordt een typed klasse. Elke gedocumenteerde parameter wordt een typed argument.

Repositories & content

Repos, Git, Contents, Branches, Tags, Releases, Forks. Lees, schrijf en verwijder bestanden. Maak branches, beheer protection rules, stel releases op en publiceer ze.

Issues & pull requests

Issues, Pulls, Reviews, Comments, Reactions, Labels, Milestones, Assignees. Het volledige collaboration-oppervlak.

Actions & checks

Actions, WorkflowRuns, WorkflowJobs, Artifacts, Secrets, Variables, Checks, CheckRuns, CheckSuites — bouw dashboards of draai automatisering op GitHub Actions-data.

Packages & container-registry

Packages, PackageVersions — beheer npm-, NuGet-, Maven-, RubyGems- en container-packages vanuit Delphi.

Organisaties & teams

Orgs, Teams, Members, Memberships, OrgsAdmin voor owner-only-operaties zoals SCIM-provisioning.

GitHub Apps

Apps, Installations, AppManifests — installeer GitHub Apps programmatisch en munt kortlevende installation-tokens.

Drie dingen om op te letten

Rate limits en conditional requests

GitHub dwingt een uurlijkse rate limit af (5.000 requests/uur met een token, 60 ongeauthenticeerd). De gegenereerde client slaat de laatste ETag voor elke GET-response op — hergebruik ze door IfNoneMatch in te stellen bij de volgende aanroep om een gratis 304-response te krijgen.

GitHub Apps hebben kortlevende tokens nodig

Voor GitHub App-installaties wissel je een JWT (ondertekend met de private key van je app) in voor een 1-uur installation-token. Gebruik de Apps.CreateInstallationAccessToken-methode en vernieuw het token voordat het verloopt.

Polymorfe timeline-events

Het Issues.ListEventsForTimeline-endpoint geeft een discriminated union van tientallen event-types terug. De gegenereerde unit levert een basisklasse en een afstammeling per variant — downcast op basis van de Event-property.

Vanuit de blog

OpenAPI Delphi-parser

Hoe de onderliggende parser real-world OpenAPI 3.x-specificaties afhandelt.

Lees post →

OpenAPI-client + parser

De bijbehorende blog-post die zowel de client-wrapper als de parser-internals introduceert.

Lees post →

sgcOpenAPI 2026.6

Nieuwste release-notes — nieuwe generator-opties en parser-fixes.

Lees post →

Bouw vandaag nog je GitHub-automatisering

sgcOpenAPI bevat de parser, code-generator, OpenAPI-server en de Amazon-, Google-, Microsoft- en Azure-SDK-bundels — een product, drie tiers.