| Termin | Definicja |
|---|---|
| GraphQL (zewnętrzna integracja) | GraphQL (zewnętrzna integracja) to alternatywny wobec REST sposób komunikacji z zewnętrznymi systemami, umożliwiający precyzyjne żądanie danych. GraphQL jako zewnętrzna integracja i sposób pobierania danychGraphQL w zewnętrznej integracji jest interfejsem komunikacyjnym, za pomocą którego aplikacja może pobierać dane z innego systemu w sposób dopasowany do konkretnego widoku, formularza albo procesu. Najważniejsza różnica względem klasycznego podejścia REST polega na tym, że klient nie musi otrzymywać całego zestawu informacji przewidzianego przez gotowy adres zasobu. W zapytaniu określa się pola, które są potrzebne w danym momencie, a system odpowiada strukturą odpowiadającą układowi żądania. Takie rozwiązanie bywa wykorzystywane przy łączeniu własnej strony, aplikacji mobilnej, panelu administracyjnego lub narzędzia sprzedażowego z usługą należącą do zewnętrznego dostawcy. Integracja może obejmować odczyt produktów, użytkowników, zamówień, treści, statusów albo danych konfiguracyjnych. Zwykle nie oznacza to bezpośredniego dostępu do bazy danych. Komunikacja odbywa się przez publiczny lub chroniony punkt API, a zakres dostępnych operacji zależy od dokumentacji i uprawnień nadanych przez właściciela zewnętrznego systemu. W praktyce GraphQL składa się z kilku współpracujących elementów. Schemat opisuje typy danych i dozwolone operacje, zapytanie określa oczekiwany zestaw pól, a odpowiedź zwraca dane w zbliżonym układzie. Mogą występować zapytania służące do odczytu, mutacje odpowiedzialne za zmianę danych oraz subskrypcje używane tam, gdzie wymagane jest obserwowanie bieżących zdarzeń. Nie każda zewnętrzna usługa udostępnia wszystkie te możliwości, dlatego przed rozpoczęciem prac należy sprawdzić faktyczny zakres interfejsu. GraphQL a REST, webhooki i inne modele komunikacjiPorównanie GraphQL z REST pomaga ustalić, czy dana integracja będzie wygodna w utrzymaniu. W REST często korzysta się z wielu adresów odpowiadających różnym zasobom. Jeden adres może zwracać dane użytkownika, inny listę zamówień, a kolejny szczegóły pojedynczego zamówienia. GraphQL często skupia te operacje wokół jednego punktu wejścia, a różnice między potrzebnymi widokami wynikają z treści zapytania. Dzięki temu łatwiej ograniczyć nadmiarowe dane przesyłane do aplikacji, szczególnie gdy ekran wymaga tylko kilku właściwości. Nie oznacza to jednak, że GraphQL jest automatycznie lepszy w każdym zastosowaniu. REST może być prostszy przy niewielkim zakresie funkcji, pobieraniu plików, publicznych zasobach albo integracjach opartych na powszechnych narzędziach. Wymiana danych za pomocą webhooków działa według innej zasady: zewnętrzny system sam wysyła powiadomienie o zdarzeniu, na przykład zmianie statusu lub utworzeniu rekordu. GraphQL może służyć do pobrania aktualnego stanu, ale nie zastępuje automatycznie mechanizmu powiadomień. Ważnym pojęciem jest introspekcja, czyli możliwość odczytania informacji o schemacie interfejsu. Bywa ona dostępna w środowisku testowym, a ograniczana w środowisku publicznym. Sam fakt, że narzędzie potrafi połączyć się z adresem API, nie potwierdza poprawności integracji. Należy jeszcze zweryfikować typy pól, wymagane argumenty, format identyfikatorów, zasady filtrowania, sortowania i paginacji oraz sposób zgłaszania błędów. Zewnętrzna dokumentacja może również określać limity zapytań i wymagania dotyczące wersji klienta. GraphQL i typowe problemy podczas integracjiJednym z częstszych problemów jest niezgodność schematu po stronie klienta i dostawcy usługi. Pole może zostać zmienione, wycofane albo przeniesione do innego typu. W GraphQL nie zawsze kończy się to całkowitym brakiem odpowiedzi. Możliwe jest otrzymanie części danych wraz z informacją o błędzie przypisaną do określonego fragmentu odpowiedzi. Aplikacja powinna taki wynik prawidłowo obsłużyć, zamiast zakładać, że każdy brak pola oznacza pustą wartość. Problematyczne bywają także uprawnienia. Token może być ważny, ale nie mieć dostępu do wybranej operacji, określonego pola albo konkretnego rekordu. W przypadku integracji z usługą zewnętrzną należy odróżnić błąd uwierzytelnienia od błędu autoryzacji. Osobnej kontroli wymaga sposób przechowywania sekretów, ponieważ klucze dostępowe nie powinny trafiać do kodu uruchamianego bezpośrednio w przeglądarce ani do publicznego repozytorium. Wydajność zależy nie tylko od liczby wysyłanych żądań, lecz także od złożoności zapytania. Rozbudowane zagnieżdżenia, pobieranie wielu relacji i brak ograniczeń głębokości mogą obciążać zarówno zewnętrzną usługę, jak i własną aplikację. Pomocne są limity stron, wybór tylko potrzebnych pól, cache dla danych rzadko zmienianych oraz kontrola czasu odpowiedzi. Warto również ustalić zachowanie przy przerwaniu połączenia, częściowej odpowiedzi, przekroczeniu limitu i czasowej niedostępności dostawcy. Osobną kategorię stanowią problemy związane z kodowaniem znaków, strefą czasową, formatem dat oraz identyfikatorami. Dane wyglądające poprawnie w jednym systemie mogą zostać błędnie zinterpretowane w innym, zwłaszcza gdy daty są traktowane jako zwykły tekst. Testy powinny obejmować rekordy bez wartości opcjonalnych, długie nazwy, znaki diakrytyczne, puste listy, wiele stron wyników oraz odpowiedzi zawierające błędy. GraphQL w praktyce: wskazówki przed podłączeniem usługiPrace najlepiej rozpocząć od opisania celu integracji językiem funkcji, a nie od samego zapytania. Należy ustalić, jakie dane mają być wyświetlane, które wartości będą zapisywane, jak często powinno następować odświeżenie oraz co ma się wydarzyć, gdy usługa zewnętrzna nie odpowie. Takie ustalenia pozwalają rozdzielić dane niezbędne od pomocniczych i ograniczyć późniejsze przeróbki. Następnie warto przygotować tabelę mapowania pól. Po jednej stronie umieszcza się nazwy używane w zewnętrznym schemacie GraphQL, a po drugiej nazwy stosowane w aplikacji. Przy każdym polu można określić typ, obowiązkowość, dopuszczalny format, sposób konwersji oraz reakcję na brak wartości. Szczególnej uwagi wymagają pola wielokrotne, relacje zagnieżdżone i struktury zwracane w formie połączeń z kursorami. Zapytania powinny być przechowywane w sposób ułatwiający ich przegląd, testowanie i zmianę. Zamiast tworzyć długi tekst zapytania w wielu miejscach kodu, korzystniej jest utrzymać wyraźnie nazwane operacje i przekazywać zmienne osobno. Ułatwia to kontrolę danych wejściowych, ogranicza ryzyko pomylenia parametrów i pozwala łatwiej porównywać zachowanie środowiska testowego z produkcyjnym. Przed uruchomieniem integracji należy wykonać testy pozytywne i negatywne. Sprawdza się poprawne pobranie danych, brak uprawnień, nieprawidłowe zmienne, pustą odpowiedź, opóźnienie, błąd usługi oraz powtórzenie żądania. Trzeba też ustalić, czy ponawianie operacji jest bezpieczne. W przypadku mutacji automatyczne powtórzenie może utworzyć duplikat, jeśli zewnętrzny system nie obsługuje klucza idempotencji. GraphQL i moment zgłoszenia integracji do serwisuDo serwisu warto zgłosić się wtedy, gdy problem nie ogranicza się do samej składni zapytania, lecz dotyczy współdziałania aplikacji, systemu operacyjnego, przeglądarki, połączenia sieciowego lub lokalnego środowiska pracy. Objawami mogą być powtarzające się błędy połączenia, niepełne odpowiedzi, zawieszanie narzędzia używanego do obsługi integracji, nieprawidłowe wyświetlanie danych albo trudności z odtworzeniem problemu na innym urządzeniu. Przed przekazaniem sprzętu dobrze jest przygotować opis objawu, moment występowania problemu, nazwę używanego programu, informację o ostatnich zmianach oraz bezpieczny, zanonimizowany fragment komunikatu błędu. Nie należy przekazywać haseł, tokenów ani kluczy dostępowych. Jeżeli problem dotyczy komputera używanego do pracy z zewnętrznym API, można skorzystać z pomocy Warszawskiego Pogotowia Komputerowego 24/7, aby sprawdzić lokalną przyczynę usterki i uporządkować dalszą diagnostykę. Trzeba pamiętać, że serwis sprzętu nie zastępuje właściciela zewnętrznej usługi. Jeżeli schemat jest niedostępny, konto zostało zablokowane albo dostawca zmienił zasady API, konieczny może być kontakt z administratorem tej usługi. Po stronie lokalnej można natomiast sprawdzić działanie systemu, aplikacji, certyfikatów, połączenia, pamięci podręcznej i konfiguracji klienta. Takie rozdzielenie odpowiedzialności przyspiesza ustalenie, czy źródłem trudności jest urządzenie, oprogramowanie, sieć czy sama usługa GraphQL. |