GitHub, herhangi bir yerde yayınlanmış en büyük OpenAPI açıklamalarından birini sürdürür ve onu MIT lisansı altında yayınlar. sgcOpenAPI elle yazılmış bir GitHub bileşeni sunmaz, bir kod üreticisi sunar. api.github.com.json üzerinde çalıştırılan tek bir komut satırı; 1.225 metot, her birinin karşılığında tipli bir yanıt sınıfı ve size hazır bir istemci veren bir GetOpenAPIClient fonksiyonu içeren tek bir Pascal birimi üretir.
Bir bakışta
GitHub + sgcOpenAPI
Aşağıdaki rakamlar tahmin değildir, kod üreticisi güncel açıklama üzerinde çalıştırılıp sonuç derlenerek ölçülmüştür.
Kaynak spesifikasyonu
github/rest-api-description deposundaki descriptions/api.github.com/api.github.com.json, OpenAPI 3.0.3 olarak bildirilmiştir. Dönüştürme adımına gerek yoktur.
Ortaya ne çıkıyor
813 yol, 1.225 metoda ve 1.134 yanıt sınıfına dönüşür; yanlarında 3.250 model sınıfıyla birlikte, yaklaşık 274.000 satırlık tek bir birim içinde.
Kimlik doğrulama
-a 2 ile üretin ve çalışma zamanında Authentication.Token.BearerToken değerini atayın. Bu, kişisel erişim belirtecini de kurulum belirtecini de aynı şekilde kapsar.
Derleniyor
Üretilen birim, kütüphane yolunda sgcOpenAPI Source klasöründen başka hiçbir şey olmadan RAD Studio 12'de Win32 için sorunsuz derlenir.
Adım 1
Kod üreticisini çalıştırın
GitHub aynı açıklamanın birkaç çeşidini yayınlar. api.github.com.json barındırılan hizmeti, ghes-3.x.json ise GitHub Enterprise Server'ı tanımlar. Hedeflediğiniz hangisiyse ondan üretin.
> sgcOpenAPI.exe -i "api.github.com.json" -o "github.pas" -a 2
File successfully created github.pas
-i yerel bir dosya ya da bir URL alır, JSON ve YAML kabul eder. -o yazılacak Pascal birimidir ve birim bu dosyanın adını taşır. -a 2 belirteç kimlik doğrulamasını seçer, böylece üretilen her metot Authorization: Bearer gönderir. Aynı çalıştırılabilir dosya, parametresiz başlatıldığında bir grafik sihirbazdır ve başarıda 0, hatalı giriş dosyasında 5, hatalı çıkış dosyasında 6, belge geçerli bir OpenAPI 3 belgesine dönüştürülemediğinde 7 koduyla çıkar.
Üretilen .pas dosyasını projenize ekleyin ve uses bölümüne koyun. Kurulacak bir bileşen yoktur, çünkü sgcOpenAPI hiçbir bileşen kaydetmez ve tasarım zamanı paketi sunmaz.
Adım 2
Depolarınızı listeleyin
GitHub, işlem kimliklerini repos/list-for-authenticated-user örneğindeki gibi eğik çizgi ve tire ile yazar. Bu karakterler bir Pascal tanımlayıcısında yer alamaz, bu yüzden kod üreticisi onları kaldırır ve metot reposlistforauthenticateduser olarak gelir.
uses
github; // az önce ürettiğiniz birimprocedure TfrmGitHub.btnReposClick(Sender: TObject);
var
oResponse: TsgcOpenAPI_reposlistforauthenticateduser_Response;
oRepo: TsgcOpenAPI_repository_Class;
begin
GetOpenAPIClient.Authentication.Token.BearerToken := txtToken.Text;
oResponse := GetOpenAPIClient.reposlistforauthenticateduser(
'private', 'owner', 'all', 'full_name', '', 100, 1);
tryif oResponse.IsSuccessful thenbeginfor oRepo in oResponse.Successful.Items do
memoLog.Lines.Add(oRepo.Full_name + ' ' + oRepo.Description);
endelse
memoLog.Lines.Add(IntToStr(oResponse.ResponseCode) + ' ' +
oResponse.ResponseError);
finally
oResponse.Free;
end;
end;
Bir dizi döndüren uç nokta, Successful özelliği tipli bir Items taşıyan bir TsgcOpenAPIArray türevi olan bir yanıt alır, burada TArray<TsgcOpenAPI_repository_Class>. Temel URL servers girdisinden gelir, dolayısıyla üretilen yapıcı https://api.github.com adresini zaten ayarlar. Sayfalama sizden gizlenmez, aPer_page ve aPage sıradan argümanlardır ve sayfalar arasında siz dolaşırsınız.
Küçük harfli adlar sizi rahatsız ediyorsa -m 1 ile üretin, o zaman metotlar işlem özetinden adlandırılır, ya da uç noktadan adlandırmak için -m 2 kullanın.
Adım 3
Bir issue oluşturun ve pull request'leri listeleyin
Yol parametreleri, belgenin bildirdiği sırayla baştaki argümanlar olarak gelir. İstek gövdesi ise, aşağıda açıklanan nedenle, bir dize olarak gelir.
var
oIssue: TsgcOpenAPI_issuescreate_Response;
oPulls: TsgcOpenAPI_pullslist_Response;
begin
oIssue := GetOpenAPIClient.issuescreate('octocat', 'Hello-World',
'{"title":"Memory leak in the HTTP/2 reader",' +
'"body":"Repro steps: ...","labels":["bug","http2"]}');
tryif oIssue.IsSuccessful then
memoLog.Lines.Add('filed issue #' +
IntToStr(oIssue.Successful.Number) + ' ' + oIssue.Successful.Html_url)
else
memoLog.Lines.Add(oIssue.Error422._message);
finally
oIssue.Free;
end;
oPulls := GetOpenAPIClient.pullslist('octocat', 'Hello-World',
'open', 'updated');
try
memoLog.Lines.Add(IntToStr(oPulls.ResponseCode));
finally
oPulls.Free;
end;
end;
Her yanıt sınıfı, Successful özelliğinin yanı sıra belgenin bildirdiği her durum kodu için bir özellik taşır, bu yüzden çağrı başarısız olduğunda okumak üzere Error304, Error401, Error403 ve Error422 oradadır. GitHub'ın adlandırılmış bir şemayla tanımladığı bir durum bir sınıfa dönüşür, hiçbir şeyle tanımlamadığı bir durum ise düz bir dizeye dönüşür. Hata özelliği ihtiyaç duyuldukça oluşturulur, dolayısıyla hiçbir zaman nil olmaz ve nesneyi sınamak yerine IsSuccessful özelliğini sınarsınız.
_message içindeki alt çizgi bir yazım hatası değildir. message, kod üreticisinin kaçış uyguladığı 68 Pascal ayrılmış sözcüğünden biridir, bu yüzden bu ada sahip bir şema alanı başında alt çizgiyle gelir. Aynısı type, object, default, index ve listenin geri kalanı için de olur, hepsi GitHub'ın şemalarının bir yerinde karşınıza çıkar.
Elde ettikleriniz
Üretilen birim neler içerir
Birim, açıklamayı birebir yansıtır. Hiçbir şey elle seçilmez, dolayısıyla GitHub'ın belgelediği her şey oradadır, GitHub'ın dışarıda bıraktığı hiçbir şey yoktur.
Belgelenen her işlem
1.225 metot; depoları ve içerikleri, issue'ları ve pull request'leri, Actions ve check run'ları, paketleri, organizasyonları ve takımları, GitHub App'leri, kod taramasını ve yüzeyin geri kalanını kapsar.
Metot başına bir yanıt sınıfı
Her biri TsgcOpenAPIResponse sınıfından türer ve 200 ile 299 arası için true olan IsSuccessful özelliğini, ayrıca ResponseCode ile ResponseError özelliklerini devralır.
3.250 model sınıfı
TsgcOpenAPI_repository_Class, TsgcOpenAPI_issue_Class, TsgcOpenAPI_basic_error_Class, TsgcOpenAPI_validation_error_Class ve components bölümündeki diğer her şema.
Yorum olarak etiketler
GitHub'ın etiketleri, tek istemci sınıfının içindeki metotları gruplayan yorumlar olarak yazılır. Ayrı sınıflara dönüşmezler, bu yüzden her şeye GetOpenAPIClient üzerinden erişilir.
Spesifikasyondaki dokümantasyon
GitHub'ın kendi açıklamaları her metodun ve her özelliğin üstüne Pascal yorumları olarak gelir, böylece IDE onları kullandığınız yerde gösterir.
Enterprise Server de dahil
ghes-3.x açıklamaları da aynı şekilde üretilir. İkisiyle birden konuşuyorsanız her hedef için ayrı bir üretilmiş birim tutun.
Başlamadan önce
Bilmeye değer dört şey
Dördü de güncel açıklama üzerinde yapılan gerçek bir üretim çalışmasından çıktı.
Birim çok büyüktür
Yaklaşık 274.000 satır ve 12 MB, burada ürettiğimiz herkese açık spesifikasyonların en büyüğü. İki saniyenin altında derlenir, ancak IDE düzenleyicisi bu boyuttaki bir dosyada yavaştır. -x, "VERB endpoint" biçiminde listelediğiniz işlemleri atar, ardından -p geriye kalan hiçbir işlemin kullanmadığı sınıfları kaldırır.
İstek gövdelerinin çoğu dizedir
343 işlem bir application/json gövdesi bildirir, ancak neredeyse hepsi bunu adlandırılmış bir şema yerine anonim satır içi bir nesne olarak tanımlar. Satır içi bir nesnenin adlandırılacak bir sınıfı yoktur, bu yüzden parametre const aBody: string olur ve JSON'u siz kurarsınız. Adlandırılmış bir şemaya başvuran birkaç tanesi tipli bir sınıf alır.
273 uyarı, hepsi okumaya değer
Çoğu, ayırt edici eşlemesi olmayan kompozisyonla ilgilidir; bu durumda üretilen sınıf her dal için bir üye taşır. Birkaçı belgenin çözemediği bir $ref bildirir, birkaçı da iki başarılı durum bildiren ve bunlardan yalnızca biri üretilen bir işlemi bildirir. Kod üreticisi sessizce seçim yapmak yerine hangisi olduğunu söyler.
Hız sınırları ve app belirteçleri size kalmıştır
Üretilen istemci sadık bir HTTP istemcisidir, fazlası değil. ETag değerlerini önbelleğe almaz, 403 alınca yeniden denemez, bir GitHub App kurulum belirtecini yenilemez. ResponseCode değerini okuyun, koşullu istek başlığı eklemek için OnBeforeRequest kullanın ve kurulum belirteçlerini birimin zaten içerdiği apps metotlarıyla üretin.
İlgili okumalar
Blogdan
OpenAPI Delphi ayrıştırıcısı
Okuyucunun gerçek spesifikasyonları nasıl işlediği, uyarıların çoğunun ardındaki kompozisyon anahtar sözcükleri dahil.
sgcOpenAPI; okuyucuyu, kod üreticisini, OpenAPI sunucusunu ve Amazon, Azure, Google ile Microsoft için hazır SDK'leri sunar. Tek ürün, üç kademe, özelliğe göre değil kullanıcı başına fiyatlandırılır.