Generator schematu GraphQL
Zamień krótką listę typów w bezpieczny szkielet SDL.
-
1Wprowadź dane
Wpisz treść, wklej tekst lub załaduj plik z dysku. -
2Kliknij przycisk
Narzędzie natychmiast przetworzy Twoje dane w przeglądarce. -
3Pobierz wynik
Skopiuj gotowy tekst lub zapisz plik na urządzeniu.
return "Wynik gotowy w 0.1s";
}
GraphQL definiuje kontrakt API w Schema Definition Language. Wykrzyknik oznacza wartość wymaganą, a pierwszy typ jest bazą generowanych operacji Query i Mutation.
Oceń to narzędzie:
Powiązane narzędzia
Inne narzędzia, które mogą Ci się przydaćGenerator schematu GraphQL — szkielet SDL z typów i pól
Generator schematu GraphQL zamienia zwięzły opis typów na dokument Schema Definition Language. Podajesz po jednym typie w wierszu, wybierasz Query, Mutation, Input oraz prostą paginację, a narzędzie buduje spójny punkt wyjścia dla API. Nazwy i odwołania do typów są sprawdzane po stronie generatora, dzięki czemu wynik nie zawiera pustych argumentów, niezdefiniowanego Input ani fragmentów dopisanych przez niedozwoloną składnię.
GraphQL i rola Schema Definition Language
Schemat jest centralnym kontraktem GraphQL. Określa dostępne typy, pola, argumenty i wartości zwracane, a narzędzia klienckie wykorzystują go do autouzupełniania oraz kontroli zapytań. SDL jest tekstowym zapisem tego kontraktu. Definicja type User opisuje obiekt wyjściowy, input UserInput dane przekazywane do operacji, type Query odczyt, a type Mutation modyfikacje. Generator tworzy strukturę, ale resolvery i reguły dostępu pozostają zadaniem aplikacji.
Format danych wejściowych
User: id: ID!, name: String!, email: String!, age: Int
Post: id: ID!, title: String!, author: User
Każdy niepusty wiersz zaczyna się nazwą typu, dwukropkiem i listą pól oddzielonych przecinkami. Pole ma format nazwa: Typ. Obsługiwane są nazwy zgodne z GraphQL, typy wbudowane, zadeklarowane typy obiektowe, DateTime, listy oraz znaczniki non-null, na przykład [String!]!. Nazwa musi zaczynać się literą lub podkreśleniem; prefiks __ jest zarezerwowany dla introspekcji i zostanie odrzucony.
Co powstaje po zaznaczeniu opcji
| Element | Zawartość | Ważne ograniczenie |
|---|---|---|
type | pola każdego typu podanego w formularzu | nazwy typów i pól muszą być unikalne |
Input | pola pierwszego typu bez pola id | nie przyjmuje obiektowych typów wyjściowych |
Query | rekord po ID oraz lista rekordów | argumenty limit/offset pojawiają się tylko z paginacją |
Mutation | operacje create, update i delete | wymaga Query i wygenerowanego Input |
scalar DateTime | deklaracja niestandardowego skalara czasu | jest dodawana tylko wtedy, gdy pole go używa |
Typy wymagane, listy i odwołania
Wykrzyknik po typie oznacza wartość non-null. String! nie dopuszcza null, [String!] jest opcjonalną listą niepustych elementów, a [String!]! wymaga również samej listy. Generator zachowuje znaczenie list w typach wyjściowych. W automatycznie zbudowanym Input usuwa jedynie zewnętrzny wymóg non-null, aby formularz wejściowy był elastycznym szkieletem; wymagalność należy później dopasować do reguł domeny.
Query bez błędnych pustych argumentów
Dla pierwszego typu User powstają pola user(id: ID!): User oraz users: [User!]!. Gdy paginacja jest włączona, lista otrzymuje argumenty limit i offset. Bez paginacji generator nie zapisuje pustego users(), ponieważ w SDL nawiasy mogą wystąpić tylko wtedy, gdy pole rzeczywiście deklaruje argumenty. To drobny szczegół, który decyduje, czy parser zaakceptuje schemat.
Input, Mutation i granica automatyzacji
Typy wejściowe i wyjściowe należą w GraphQL do różnych kategorii. Obiekt User nie może być bezpośrednim typem pola w UserInput; potrzebny byłby osobny zagnieżdżony typ input. Dlatego generator zatrzymuje się z czytelnym komunikatem, gdy pierwsza definicja zawiera relację obiektową, a użytkownik żąda Input. Podobnie Mutation nie powstanie bez Query i Input. Chroni to przed dokumentem, który wygląda kompletnie, lecz odwołuje się do niezdefiniowanego typu.
Walidacja nazw i ochrona generowanego dokumentu
Formularz jest tylko wygodnym interfejsem, nie granicą bezpieczeństwa. Komponent ponownie sprawdza długość wejścia, liczbę typów i pól, duplikaty, nazwy zastrzeżone oraz gramatykę odwołań do typów. Klamry, dyrektywy i dodatkowe definicje nie mogą zostać przemycone w nazwie pola albo typu. Wynik jest wyświetlany jako tekst, a nie wykonywany na serwerze. Przed wdrożeniem nadal należy uruchomić parser GraphQL i testy integracyjne własnej aplikacji.
Jak przygotować schemat krok po kroku
- Zacznij od głównego zasobu i wypisz jego stabilne pola wraz z typami skalarnymi.
- Dodaj kolejne typy w osobnych wierszach, jeżeli pola odwołują się do obiektów.
- Włącz Query, aby utworzyć odczyt rekordu i listy; dla większych zbiorów dodaj paginację.
- Włącz Input i Mutation tylko wtedy, gdy pierwszy typ ma pola możliwe do użycia jako dane wejściowe.
- Skopiuj SDL, dodaj opisy, enumy, dyrektywy, interfejsy i bardziej dopasowane typy Input.
- Uruchom parser schematu, dopisz resolvery, autoryzację, limity złożoności i testy operacji.
Praca z JSON, typami klienta i konfiguracją
GraphQL zwraca odpowiedź JSON, dlatego przykładowy payload warto najpierw sprawdzić w walidatorze JSON. Gdy kontrakt jest gotowy, narzędzia codegen mogą na jego podstawie tworzyć typy klienta; ustawienia projektu TypeScript przygotujesz w generatorze tsconfig. Jeśli potrzebujesz formalnego opisu dokumentów JSON niezależnego od GraphQL, użyj generatora JSON Schema. Te formaty rozwiązują różne problemy: SDL opisuje graf i operacje API, a JSON Schema strukturę konkretnego dokumentu.
Najczęściej zadawane pytania
Czy generator tworzy działający serwer GraphQL?
Nie. Powstaje dokument SDL opisujący kontrakt. Serwer wymaga biblioteki wykonawczej, resolverów, źródła danych, autoryzacji i konfiguracji.
Co oznacza wykrzyknik przy typie?
To znacznik non-null. Pole String! nie może zwrócić null, a argument ID! musi zostać dostarczony przez klienta.
Dlaczego Mutation wymaga Input i Query?
Wygenerowane operacje create i update korzystają z nazwanego typu Input, a wykonywalny schemat potrzebuje głównego typu Query. Wymuszenie tych opcji zapobiega brakującym odwołaniom.
Czy mogę używać własnych scalarów i enumów?
Uproszczona składnia obsługuje wbudowane skalary oraz DateTime. Inne scalary, enumy, interfejsy i unie dopisz po skopiowaniu wyniku lub zadeklaruj w docelowym projekcie.
Czy limit/offset jest najlepszą paginacją?
To prosty punkt startowy. Przy zmiennych i dużych zbiorach często lepsza jest paginacja kursorowa zgodna z modelem connections, którą trzeba zaprojektować ręcznie.