Klient REST API GitHub dla Delphi przez sgcOpenAPI
GitHub utrzymuje jeden z największych opisów OpenAPI publikowanych gdziekolwiek i wydaje go na licencji MIT. sgcOpenAPI nie dostarcza ręcznie napisanego komponentu GitHub, dostarcza generator. Jedno wywołanie w wierszu poleceń na pliku api.github.com.json tworzy pojedynczą jednostkę Pascala z 1225 metodami, typowaną klasą odpowiedzi dla każdej z nich oraz funkcją GetOpenAPIClient, która zwraca gotowego klienta.
W skrócie
GitHub + sgcOpenAPI
Poniższe liczby zostały zmierzone przez uruchomienie generatora na bieżącym opisie i skompilowanie wyniku, nie są szacunkami.
Specyfikacja źródłowa
descriptions/api.github.com/api.github.com.json w github/rest-api-description, zadeklarowany jako OpenAPI 3.0.3. Żaden krok konwersji nie jest potrzebny.
Co z tego powstaje
813 ścieżek zamienia się w 1225 metod i 1134 klasy odpowiedzi, obok 3250 klas modeli, w jednej jednostce liczącej około 274 000 wierszy.
Uwierzytelnianie
Generuj z -a 2 i ustaw Authentication.Token.BearerToken w czasie działania. Obejmuje to tak samo personal access token, jak i token instalacji.
Kompiluje się
Wygenerowana jednostka buduje się bez błędów w RAD Studio 12 dla Win32, przy czym na ścieżce bibliotek nie ma nic poza folderem Source sgcOpenAPI.
Krok 1
Uruchom generator
GitHub publikuje kilka odmian tego samego opisu. api.github.com.json opisuje usługę hostowaną, a ghes-3.x.json opisuje GitHub Enterprise Server. Generuj z tej, w którą celujesz.
> sgcOpenAPI.exe -i "api.github.com.json" -o "github.pas" -a 2
File successfully created github.pas
-i przyjmuje plik lokalny lub adres URL i akceptuje JSON oraz YAML. -o to jednostka Pascala do zapisania, a jednostka bierze nazwę od tego pliku. -a 2 wybiera uwierzytelnianie tokenem, więc każda wygenerowana metoda wysyła Authorization: Bearer. Ten sam plik wykonywalny jest kreatorem graficznym, kiedy uruchomisz go bez parametrów, i kończy się kodem 0 przy powodzeniu, 5 przy złym pliku wejściowym, 6 przy złym pliku wyjściowym oraz 7, kiedy dokumentu nie da się zamienić w poprawny dokument OpenAPI 3.
Dodaj wygenerowany plik .pas do projektu i wpisz go do klauzuli uses. Nie ma komponentu do zainstalowania, ponieważ sgcOpenAPI nie rejestruje żadnego i nie dostarcza pakietu design-time.
Krok 2
Listuj swoje repozytoria
GitHub zapisuje identyfikatory operacji z ukośnikami i łącznikami, jak repos/list-for-authenticated-user. Takie znaki nie mogą wystąpić w identyfikatorze Pascala, więc generator je usuwa i metoda przychodzi jako reposlistforauthenticateduser.
Endpoint, który zwraca tablicę, dostaje odpowiedź, w której Successful jest potomkiem TsgcOpenAPIArray z typowanym Items, tutaj TArray<TsgcOpenAPI_repository_Class>. Bazowy adres URL pochodzi z wpisu servers, więc wygenerowany konstruktor ustawia już https://api.github.com. Paginacja nie jest przed tobą ukrywana: aPer_page i aPage to zwykłe argumenty, a po stronach przechodzisz sam.
Jeśli nazwy pisane małymi literami ci przeszkadzają, generuj z -m 1, a metody będą nazwane od podsumowania operacji, albo z -m 2, żeby nazwać je od endpointu.
Krok 3
Utwórz issue i wylistuj pull requesty
Parametry ścieżki przychodzą jako pierwsze argumenty, w kolejności zadeklarowanej w dokumencie. Ciało żądania przychodzi jako łańcuch znaków, z powodu wyjaśnionego poniżej.
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;
Każda klasa odpowiedzi niesie Successful plus jedną właściwość na każdy kod statusu zadeklarowany w dokumencie, więc Error304, Error401, Error403 i Error422 są na miejscu do odczytania, kiedy wywołanie się nie powiedzie. Status, który GitHub opisuje nazwanym schematem, staje się klasą, a taki, którego nie opisuje niczym, staje się zwykłym łańcuchem znaków. Właściwość błędu jest tworzona na żądanie, więc nigdy nie jest nil i sprawdzasz IsSuccessful, a nie sam obiekt.
Podkreślenie w _message nie jest literówką. message to jedno z 68 słów zastrzeżonych Pascala, które generator poprzedza znakiem ucieczki, więc pole schematu o tej nazwie przychodzi z wiodącym podkreśleniem. To samo dzieje się z type, object, default, index i resztą listy, a wszystkie one pojawiają się gdzieś w schematach GitHub.
Co dostajesz
Co zawiera wygenerowana jednostka
Jednostka odzwierciedla opis. Nic nie jest ręcznie dobierane, więc wszystko, co GitHub dokumentuje, jest obecne, a czego GitHub nie dokumentuje, tego nie ma.
Każda udokumentowana operacja
1225 metod, obejmujących repozytoria i ich treść, issues i pull requesty, Actions i check runs, packages, organizacje i zespoły, aplikacje GitHub, code scanning oraz resztę powierzchni.
Jedna klasa odpowiedzi na metodę
Każda dziedziczy po TsgcOpenAPIResponse i przejmuje IsSuccessful, które jest prawdą dla statusów od 200 do 299, wraz z ResponseCode i ResponseError.
3250 klas modeli
TsgcOpenAPI_repository_Class, TsgcOpenAPI_issue_Class, TsgcOpenAPI_basic_error_Class, TsgcOpenAPI_validation_error_Class i każdy inny schemat z sekcji components.
Tagi jako komentarze
Tagi GitHub są emitowane jako komentarze, które grupują metody wewnątrz jednej klasy klienta. Nie stają się osobnymi klasami, więc wszystko wisi na GetOpenAPIClient.
Dokumentacja ze specyfikacji
Własne opisy GitHub przechodzą jako komentarze Pascala nad każdą metodą i właściwością, więc IDE pokazuje je tam, gdzie ich używasz.
Także Enterprise Server
Opisy ghes-3.x generują się tak samo. Trzymaj po jednej wygenerowanej jednostce na cel, jeśli rozmawiasz z obydwoma.
Zanim zaczniesz
Cztery rzeczy, które warto wiedzieć
Wszystkie cztery wyszły z rzeczywistego uruchomienia generatora na bieżącym opisie.
Jednostka jest bardzo duża
Około 274 000 wierszy i 12 MB, największa z publicznych specyfikacji, które tutaj generujemy. Kompiluje się w mniej niż dwie sekundy, ale edytor IDE działa wolno przy pliku tej wielkości. -x usuwa operacje wypisane jako "VERB endpoint", a -p usuwa potem klasy, których nie używa żadna pozostała operacja.
Większość ciał żądań to łańcuchy znaków
343 operacje deklarują ciało application/json, ale prawie wszystkie opisują je jako anonimowy obiekt inline, a nie jako nazwany schemat. Obiekt inline nie ma klasy do nazwania, więc parametrem jest const aBody: string i JSON budujesz sam. Ta garstka, która odwołuje się do nazwanego schematu, dostaje typowaną klasę.
273 ostrzeżenia, warte przeczytania
Większość dotyczy kompozycji bez mapowania dyskryminatora, gdzie wygenerowana klasa niesie jeden składnik na gałąź. Kilka zgłasza $ref, którego dokument nie rozwiązuje, a kilka zgłasza operację deklarującą dwa statusy powodzenia, z których generowany jest tylko jeden. Generator mówi który, zamiast wybierać po cichu.
Limity szybkości i tokeny aplikacji są po twojej stronie
Wygenerowany klient jest wiernym klientem HTTP i niczym więcej. Nie buforuje wartości ETag, nie ponawia po 403 ani nie odświeża tokenu instalacji GitHub App. Czytaj ResponseCode, użyj OnBeforeRequest, aby dodać nagłówek żądania warunkowego, i wybijaj tokeny instalacji metodami apps, które jednostka już zawiera.
Powiązane lektury
Z bloga
Parser OpenAPI Delphi
Jak czytnik obsługuje rzeczywiste specyfikacje, w tym słowa kluczowe kompozycji stojące za większością ostrzeżeń.
sgcOpenAPI dostarcza czytnik, generator kodu, serwer OpenAPI oraz gotowe pakiety SDK dla Amazon, Azure, Google i Microsoft. Jeden produkt, trzy poziomy, wycena za stanowisko, a nie za funkcję.