Najważniejsze zagadnienia, które musisz znać
5 godz. 53 min · JavaScript · Full-stack i Programowanie
Adam GospodarczykPrzesyłanie oraz transformacja danych to jeden z najważniejszych elementów działania każdej aplikacji. Dobre zrozumienie tego w jaki sposób odbywa się ten proces, daje równocześnie lepsze zrozumienie całej struktury oraz podejmowania decyzji projektowych. W tym kursie znajdziesz lekcje, które pozwolą Ci uporządkować wiedzę na temat protokołu HTTP oraz formatów wymiany danych.
REST oraz GraphQL to nadal nieodłączone zagadnienia tematu wymiany informacji w kontekście aplikacji webowych. Pomimo tego, że ich koncepcje zwykle są bardzo dobrze opisane w różnych źródłach, tak ich wykorzystanie "na produkcji" potrafi sprawić problemy. W szczególności gdy weźmiemy pod uwagę, wyjątki oraz fakt, że nie każda aplikacja będzie wymagać implementacji REST czy GraphQL w 100%. W tym kursie znajdziesz wiele praktycznych wskazówek związanych z pracą z REST API oraz wprowadzenie do pracy z GraphQL.
Niektóre błędy w aplikacji są bardzo pożądane, w szczególności gdy jasno informują użytkownika o tym, co się wydarzyło oraz o tym, co może z tym zrobić. Pomimo tego, że w wielu przypadkach opracowanie komunikatów leży w rękach osoby odpowiedzialnej za copywriting (i/lub ux writing), tak sama implementacja tych komunikatów odbywa się po stronie kodu. Nie rzadko okazuje się, że poprawna i skuteczna walidacja danych oraz obsługa błędów nie jest oczywista w "produkcyjnych" sytuacjach. W tym kursie znajdziesz najczęściej spotykane problemy oraz sposoby ich rozwiązania.
Bazy danych są praktycznie nieodłączną częścią każdej aplikacji. W roli full-stacka prędzej czy później przyjdzie Ci z nimi pracować a nie rzadko nawet projektować oraz rozbudowywać ich struktury. W tym kursie znajdziesz informacje o bazach danych, które pozwolą Ci je zrozumieć oraz od razu poznać użyteczne techniki, które pomogą Ci w pracy z nimi, zarówno na produkcji jak i w środowisku lokalnym czy testowym.
Nie wszystkie informacje w aplikacji są publiczne. Niektóre wprost nie mogą takie być. Z tego powodu niezbędne są sposoby na to aby poznać a potem weryfikować tożsamość użytkownika, by na jej podstawie przydzielać mu dostęp wyłącznie do zasobów, do których odczytywania posiada uprawnienia. Istnieje wiele technik, które umożliwiają zarządzanie dostępem do danych i w tym kursie poznasz najważniejsze z nich. Dowiesz się nie tylko w jaki sposób zabezpieczać dane ale poznasz też najpopularniejsze sposoby na to aby te zabezpieczenia łamać i obchodzić. Mając świadomość takiej możliwości, będziesz w stanie lepiej podejmować decyzje o tym jak projektować dostęp do informacji.
Istnieją problemy charakterystyczne dla niemal każdej aplikacji. W związku z ich powszechnością, istnieje też szereg rozwiązań lub sposobów na to, aby możliwie zredukować ich następstwa. Na przestrzeni lekcji tego kursu zobaczysz wiele przykładów, które pomogą Ci w codziennej pracy a niekiedy nawet, pozwolą uniknąć błędów, których konsekwencje nie zawsze występują natychmiast.
Kurs powstał z myślą o osobach, które chcą rozwijać się w roli full-stack web developera / developerki, przeprowadzając przez najważniejsze zagadnienia z obszaru wymiany, transformacji oraz przechowywania informacji w aplikacji oraz pomiędzy aplikacjami. Jeżeli potrzebujesz zobaczyć szeroką perspektywę tego, w jaki sposób dane przepływają pomiędzy różnymi częściami aplikacji, lub ugruntować swoją wiedzę na ten temat, to ten kurs jest miejscem, którego szukasz.
Gra w Call to tzw.
Query language, stanowiące alternatywę dla REST API.
Sprawdza się szczególnie w przypadku, gdy
mamy do czynienia z aplikacjami, które działają na wielu platformach lub też
chociażby ich skalę wymaga dużej elastyczności, którą zapewnia gra SQL.
W przeciwieństwie do REST API,
jednocześnie w małych i średnich aplikacjach REST API sprawdzi się
zdecydowanie lepiej lub też w kilku innych przypadkach powiemy sobie za chwilę.
Zacznijmy od tego, że najważniejszą różnicą pomiędzy graniem w Call a REST API
jest fakt, że REST API umożliwia nam dostęp do danych poprzez udostępnienie end
pointów, na które możemy kierować zapytania, a w przypadku Graph Call mamy
po prostu jeden endpoint, na który kierujemy wszystkie zapytania, wliczając w
to zarówno pobieranie danych, jak i modyfikowanie czy usuwanie.
Coś takiego na tym etapie powinno podsuwać
Ci już szereg korzyści, które z tego wynikają.
Mianowicie, w momencie, gdy zaprojektujemy
REST API, musimy przede wszystkim przewidzieć dość dokładnie jakie dane będą
dostępne dla klienta oraz w jaki sposób będzie wchodzić z nimi w interakcje.
Co więcej, mamy tutaj pewne ograniczenia,
o ile oczywiście ich w jakiś sposób nie adresujemy.
Przykładowo wyobraź sobie sytuację, w której chcesz pobrać użytkowników, ale tak
naprawdę interesują Cię tylko ich adresy email.
Teoretycznie moglibyśmy podać tutaj
dodatkowy parametr i respektować go w momencie pobierania informacji na temat
użytkowników, aby do klienta zwrócić tylko te wybrane pola.
Ale co w sytuacji, gdy razem z
użytkownikami będziemy chcieli zwrócić artykuły?
Sytuacja na tym etapie już znacznie się komplikuje.
Jednocześnie w przypadku gra w call dalej
mamy do czynienia z jednym endpoint, który odpowiada za praktycznie wszystko.
Oczywiście to nie jest tak, że działa tutaj jakaś absolutna magia, która
sprawia, że gra w call jest w stanie domyślić się, co chcemy dokładnie pobrać,
ale po prostu ta elastyczność jest odpowiednio większa.
Poza tym istnieje jeszcze szereg różnych
korzyści zarówno REST API, jak i gra SQL, które należy brać pod uwagę w momencie,
gdy zdecydujesz się na jedno bądź drugie rozwiązanie.
Z tego powodu tak dużo uwagi poświęcamy właśnie REST API, a nie gra SQL.
Ze względu na to, że przykładowo ja w moich aplikacjach tylko w pojedynczych
przypadkach sięgam po SQL, ponieważ po prostu nie widzę takiej potrzeby.
Nie zmienia to jednak faktu, że gra SQL obecnie jest już na tyle poważnym graczem,
że na pewno trzeba brać go pod uwagę i wiedzieć w jaki sposób można z niego
skorzystać, przynajmniej od strony użytkownika.
Oczywiście tutaj też wchodzi cały temat
projektowania serwera gra SQL, ale to już znacząco wykracza poza zakres tego
materiału, więc tylko przyjrzymy się jak to może wyglądać.
Na początek być może zastanawia Cię jak to
w ogóle jest możliwe, że jeden endpoint obsługuje praktycznie każdy rodzaj zapytań
i dodatkowo zapewnia nam tak wysoką elastyczność?
Mianowicie w przypadku gdy SQL
zapytanie na wybrany endpoint wygląda w następujący sposób.
Jak widać nie mamy tutaj rozróżnienia
pomiędzy metodami GET oraz POST czy PUT, ale zapisujemy coś w rodzaju obiektu
Jackson, który opisuje strukturę informacji, którą chcemy uzyskać.
Nietrudno się domyślić, że chodzi nam o pobranie informacji na temat użytkowników,
a konkretnie ich imion, emaili, oceny oraz artykułów.
W odpowiedzi na tak zadane zapytanie
otrzymujemy obiekt Jackson o następującej strukturze.
Od razu tutaj widać, że ta struktura
odpowiada dokładnie temu, co zapisaliśmy w zapytaniu.
Zatem mamy tutaj poszczególne pola oraz artykuły.
Tak naprawdę jeszcze to w przypadku artykułów powinniśmy tutaj zapisać
dodatkowe pola, które chcemy na ich temat pobrać.
Zatem załóżmy, że interesuje nas tytuł.
W związku z tym zapytanie będzie wyglądało w taki sposób.
W tym akurat przypadku do tego użytkownika
nie są przypisane żadne artykuły, natomiast gdyby były, to mielibyśmy tutaj
do czynienia z obiektami zawierającymi w tym przypadku jedną właściwość.
Co więcej, nawet w sytuacji, gdybyśmy mieli w tym przypadku do czynienia z
artykułami, pod którymi byłyby komentarze, to aby je pobrać jedyne co musielibyśmy
zrobić, to po stronie frontendu tak naprawdę musielibyśmy dopisać dodatkową
właściwość Comment, gdzie również uwzględnili byśmy np.
ich zawartość czy informacje o autorze.
I właśnie na tym polega cała elastyczność
call, a jednocześnie myślę, że też dość widoczne stają się dla Ciebie zarówno
zalety takiego podejścia, jak i różnego rodzaju wady.
Przykładowo mam tutaj na myśli chociażby
wykorzystanie pamięci podręcznej, którą oferują przeglądarki i z której w
przypadku REST API możemy korzystać praktycznie domyślnie, a w przypadku grafu
Old system pamięci podręcznej musimy konfigurować samodzielnie.
Podobnie też wszystkie odpowiedzi gra SQL zwracają status 200.
W przeciwieństwie do REST API, gdzie
możemy rozróżniać właśnie na podstawie statusów, to, czy na przykład jakaś
operacja została wykonana pomyślnie, czy też nie.
To wszystko prowadzi nas do jednego
wniosku, który całkiem dobrze został podsumowany w tym zdaniu.
Mianowicie w momencie, gdy mamy do czynienia z aplikacją mobilną, bądź też
bardziej wielo platformowa, to najprawdopodobniej lepszym wyborem będzie.
Nie gra w call. W przypadku, gdy potrzebujemy bardzo
ściśle określonego API, takiego na którym będziemy mieć jasną
kontrolę, zdecydowanie lepszym rozwiązaniem będzie REST.
Z mojego doświadczenia wynika to, co
powiedziałem wcześniej, że w większości przypadków w momencie, gdy projektuję małe
i średnie aplikacje, REST API jest w zupełności wystarczające.
Jednak w momencie, gdy przyjdzie mi rozwijać jakiś większy system, bądź też
właśnie wielo platformowe, to myślę, że gra SQL będzie tutaj lepszym wyborem.
Jeżeli sam temat Cię interesuje to odsyłam Cię do artykułów, które wyjaśniają w
bardziej szczegółowy sposób różnice pomiędzy rest API agrafki el oraz
pokazują, które rozwiązanie sprawdzi się w tym przypadku.
Szczerze mówiąc jednak bardzo często można spotkać sytuację, w której autor jest
uprzedzony do konkretnego rozwiązania i na siłę próbuje znaleźć argumenty
przekonujące nas do jednego bądź drugiego rozwiązania.
Wydaje mi się, że dobrze jest wyrobić
sobie własne zdanie i jednocześnie brać pod uwagę elementy takie jak np.
to, czy np. aplikacja, którą budujesz faktycznie
skorzysta na zaletach, czy być może wręcz przeciwnie.
Myślę, że na ten moment wiesz o co mi tutaj chodzi.
Natomiast raz jeszcze podkreślę tutaj, że
w naszym przypadku będziemy opierać się raczej o rest API.
Nie zmienia to jednak faktu, że gra wgl powinien być na Twoim radarze i w momencie
gdy nadejdzie na to odpowiednia chwila, warto, aby brak doświadczenia w jego
wykorzystaniu nie stanął na przeszkodzie, aby skorzystać z jego zalet.
Tutaj jeszcze zanim przejdziemy dalej,
chciałbym podkreślić, że tak jak w tym miejscu mieliśmy do czynienia z zapytaniem
popierającym informację, tak jednocześnie gra SQL oferuje tzw.
mutacje, które umożliwiają nam wykonywanie akcji takich jak np.
aktualizowanie bądź usuwanie zasobu.
To wszystko nadal realizowane jest w tej dość elastycznej strukturze, która pozwala
nam elastycznie definiować to, które pola aktualizujemy i jakie informacje np.
chcemy pobrać w momencie wykonania tego działania.
Czyli tutaj aktualizujemy użytkownika, a konkretnie jego imię i w odpowiedzi
otrzymujemy jego identyfikator oraz zaktualizowane imię.
Jednocześnie już tutaj zaczyna być bardzo widoczne to, że te wszystkie akcje nie
dzieją się automagicznie i ktoś musi zadbać o to, aby gracz wiedział w jaki
sposób interpretować te wszystkie zapytania i co z nimi robić.
Nie będę Cię tutaj oszukiwał, ponieważ jako full stack ta rola przypadnie Tobie.
O ile oczywiście nie korzystasz z
zewnętrznego serwera, do którego podłączasz się poprzez właśnie gra w call.
Zanim jednak przyjrzymy się temu nieco bliżej.
Ja wykonałem już trochę pracy i
przygotowałem bardzo prosty serwis, który udostępnia nam charakterystyczne dla
grafiku El Playground, z pomocą którego możemy wykonywać zapytania takie jak np.
pobieranie informacji na temat użytkowników i mamy tutaj dokładne
odpowiednik tego, co zobaczyliśmy na poprzednich slajdach.
Mianowicie zwróć uwagę, że definiuję tutaj zapytanie.
Dodatkowo nadaje mu tutaj nazwę, która akurat w tym przypadku jest dowolna, a
następnie określa to jakie informacje o jakiej strukturze chcę tutaj pobrać.
Jednak w tym przypadku zwróć uwagę, że zapytaliśmy tutaj o właściwość Active, a
pomimo tego nie otrzymaliśmy jej w odpowiedzi.
Wynika to z faktu, że w tym konkretnym
przypadku ten użytkownik nie posiada tej właściwości.
Jednocześnie jeżeli pobierzemy sobie
informacje na temat użytkownika o identyfikatorze 2,
to w tym przypadku nie jest zaskoczeniem, że otrzymamy odpowiedź w postaci nulla ze
względu na to, że taki użytkownik nie istnieje, ale oczywiście możemy go sobie
utworzyć wykorzystując trzecie zapytanie, które jest mutacją tworzącą użytkownika.
Dzięki temu użytkownik o identyfikatorze 2 już istnieje, więc możemy wykonać
zapytanie, które pobierze informacje na jego temat.
I w rezultacie otrzymujemy dokładnie taką odpowiedź.
Naturalnie, jeżeli chciałbym tutaj coś
zmodyfikować i na przykład pobrać wyłącznie adres email, to oczywiście
zostanie tutaj zastosowane i odpowiedź będzie posiadała taką, a nie inną formę.
Poza tym jeżeli chodzi o sam plik, myślę, że warto rzucić okiem jeszcze na
dokumentację, która swoją drogą generuje się tutaj automatycznie na podstawie tzw.
schematu grafu L, który oczywiście musimy sami przygotować.
Jest to jeden z pierwszych elementów,
które mówi o tym, że w przypadku gdy wgl nie wszystko dzieje się automatycznie.
Nie zmienia to jednak faktu, że
informacje, które mamy tutaj są bardzo użyteczne.
Możemy w ten sposób podglądać, które
właściwości są przykładowo wymagane, a które opcjonalne.
Mamy też dostęp do wszystkich rodzajów, metod i mutacji, które możemy zastosować.
Oznacza to mniej więcej tyle, że wystarczy
spojrzeć na to, co mamy dostępne, aby w prosty sposób przygotować np.
mutacje usuwające użytkownika o wskazanym identyfikatorze.
W naszym przypadku wystarczy podać tutaj dane użytkownika, a konkretnie jego
identyfikator, który pozwoli nam go odnaleźć, a następnie określić, jakie
informacje chcemy otrzymać w odpowiedzi zwrotnej.
Zatem teraz po usunięciu tego użytkownika otrzymujemy informację zwrotną, że
operacja została wykonana poprawnie, a do tego użytkownika to.
I właśnie tak wygląda wchodzenie w interakcję z serwerem SQL oraz wysyłaniem
do niego zapytań oraz mutacji, które modyfikują bądź usuwają dane.
Naturalnie w zależności od tego, czy
będziesz projektować własny serwer SQL, czy też po prostu wykorzystywać go po
stronie swojej aplikacji po stronie frontendu zależy już od Twoich potrzeb.
Dobra wiadomość jest taka, że w
ekosystemie JavaScriptu praktycznie wszystkie dostępne, a przynajmniej te
najpopularniejsze frameworki umożliwiają bezproblemową integrację z gra wgl.
Myślę, że taką najważniejszą informacją,
którą musisz zapamiętać z tej lekcji jest fakt, że gra SQL w przeciwieństwie do REST
API oferuje dostęp do danych w sposób elastyczny za pośrednictwem jednego end
pointa, gdzie po prostu określamy jaki rodzaj zapytania chcemy wykonać.
A serwer SQL przygotowany jest w taki
sposób, aby móc przygotować stosowną dla nas odpowiedź.
Jeżeli chodzi o szybkie wprowadzenie do gra SQL, to by było na tyle.
W związku z tym nie pozostaje mi nic
innego jak zaprosić Cię do kolejnej lekcji.
Dzięki za uwagę i do usłyszenia za chwilę.