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.
W tej lekcji przyjrzymy się jeszcze kilku
tematom dotyczącym rest API, które warto poruszyć, a na które nie będzie już
miejsca w momencie, gdy będziemy mówić o praktycznym projektowaniu i wdrażaniu API.
Pierwszym z takich elementów jest coś, o
czym zdarzyło mi się już wspomnieć, a mianowicie wyjątki.
Chodzi o to, że pomimo tego, że REST API rekomenduje nam, abyśmy dla zasobów
wykorzystywali rzeczowniki w liczbie mnogiej, czyli np.
użytkownicy, to i tak czasem mogą pojawić
się sytuacje, w których będzie konieczność wykorzystania czasownika, czyli np.
wyszukaj. W praktyce coś takiego narusza zasady rest
API, ale jednocześnie na potrzeby naszej aplikacji może być wymagane.
Z tego powodu, jeżeli zajdzie taka potrzeba.
Pamiętaj o tym, że naturalnie istnieje
możliwość, aby naruszyć te rekomendacje jednocześnie na tyle, na ile to możliwe.
Staraj się trzymać swojego API w miarę blisko zasad, na które się decydujesz.
Inaczej mówiąc, w momencie, gdy nawet w
dobrze zaprojektowanym REST API pojawi się jakiś niestandardowy endpoint, to tak
naprawdę w tej sytuacji, o ile zachowamy odpowiednie statusy odpowiedzi i
odpowiedzi, nie będzie z jego wykorzystaniem większych problemów.
Pamiętaj jednak, że w momencie, gdy na coś
takiego się decydujesz, może dojść do sytuacji konfliktowych.
Mianowicie, jeżeli będziemy mieli zadeklarowany endpoint, który będzie
wykorzystywać metodę POST, potrzebujemy tutaj przesłać rozbudowane
dane, które umożliwią nam dokonanie wyszukiwania.
No to w tej sytuacji wchodzimy w konflikt
z endpoint, który pobiera informacje na temat użytkowników.
Mianowicie jeżeli kolejność tych endpoint wyglądałaby następująco, to w momencie gdy
wyślemy zapytanie na ten zasób otrzymamy błąd 404.
Wynika to z faktu, że zostanie uruchomiona
akcja obsługująca endpoint zdefiniowany tutaj i po prostu słowo set zostanie
potraktowane tutaj jako identyfikator użytkownika.
W związku z tym albo musimy upewnić się,
że struktura naszych endpoint nie wchodzi w konflikt, czyli np.
możemy tutaj zrobić wyszukiwanie, które
umożliwi nam zdefiniowanie typu zasobu, który przeszukujemy lub też po prostu
upewnić się, że kolejność jest tutaj właściwa.
Według mnie to pierwsze rozwiązanie jest
lepsze, ale jednocześnie jest to decyzja, którą samodzielnie musisz podjąć.
Najważniejsze z tej reguły jest to, aby pamiętać o tym, że zasady REST nie są po
to, aby sztywno się ich trzymać i też utrudniać sobie pracę w wielu przypadkach.
W dążeniu do tego, aby być maksymalnie kompatybilnym ze standardami, ale po to,
aby określać ogólną strukturę naszego API, które będzie dążyć do zachowania tej
spójności, ale nie kosztem wysokiego narzutu pracy, który również będzie
przekładał się potem na utrzymanie takiego API i jego rozwój.
No i właśnie w ten sposób dochodzimy do
drugiego wątku, który trzeba tutaj poruszyć.
Czyli same decyzje projektowe.
Przykładowo to czy wykorzystasz metody PUT
czy POST do tworzenia nowych użytkowników również zależy tylko od Ciebie.
Teoretycznie w sytuacji, gdy znany jest
docelowy adres naszego tworzonego zasobu, powinniśmy wykorzystać metodę PUT i
umożliwić użytkownikowi zdefiniowanie takiego zasobu.
Dodatkowo musimy też podjąć decyzję, co
się stanie w momencie, gdy taki zasób będzie już istniał, albo zdecydujemy się
tutaj na wykorzystanie mechanizmu accept, czyli po prostu sprawdzenia czy dany wpis
istnieje i jeżeli tak, to go aktualizujemy, a w przeciwnym razie
tworzymy, bądź też po prostu wykorzystujemy PUT wyłącznie do tego, aby
aktualizować użytkowników, a do ich tworzenia wykorzystujemy metodę POST.
To oczywiście tylko jeden z wielu
przykładów decyzji projektowych, które przyjdzie Ci podejmować.
Z mojej strony mogę tylko powiedzieć, że za każdym razem raczej staram się trzymać
tego, aby zachować rzeczy tak prostymi jak tylko możliwe, a nie prostszymi, ale też
możliwie ułatwiać sobie pracę, przewidując ewentualnie dalsze kroki, które mogą
wystąpić, ale niekoniecznie też wychodzę tutaj w jakąś bliżej nieokreśloną
przyszłość, próbując przygotować się na ewentualności, które nigdy nie nastąpią.
Inaczej mówiąc, chodzi tutaj o zachowanie zdrowego rozsądku oraz balansu pomiędzy
tym, co jest tu i teraz, a tym, co będzie w przyszłości.
Pamiętaj o tym, że w momencie, gdy tworzysz publiczne API, Twoje decyzje mogą
wpływać potem na wiele różnych aplikacji, które będą podłączone do Twojego API.
Oznacza to mniej więcej tyle, że każda
kolejna decyzja, którą będziesz wprowadzać, nie będzie już zależała tylko
od Ciebie, ale będzie trzeba też brać pod uwagę innych użytkowników, którzy
korzystają z przygotowanego przez Ciebie interfejsu.
Domyślasz się pewnie, że to, o czym mówię, nie jest prostą sztuką.
Jednocześnie nie mam możliwości nauczyć
się tego wszystkiego, nawet gdybyśmy spędzili tutaj wiele miesięcy.
Z tego powodu w tym miejscu to na Tobie
spoczywa odpowiedzialność, aby rozwijać swoje umiejętności.
I w związku z tym ja mogę Ci tylko polecić jedno ze źródeł, które pamiętam, że na
pewnym etapie bardzo mi pomogło właśnie przy projektowaniu API.
Dodatkowo pamiętaj o tym, że oprócz rest API mamy również np.
gra SQL czy inne sposoby umożliwiające komunikację.
W związku z czym musisz również brać je pod uwagę i ewentualnie decydować się na
nie w momencie, gdy uznasz, że jest to uzasadnione.
W każdym razie, jeżeli chcesz rozwijać
swoje umiejętności budowania apek, których nie będziesz nienawidzieć oraz też Twoi
użytkownicy, no to mogę polecić Ci książkę, którą właśnie widzisz na ekranie.
Oczywiście na ten temat powstało jeszcze
wiele innych książek, do których warto zajrzeć, przynajmniej po to, aby je
przekartkować i zajrzeć w przynajmniej w te obszary, które sprawiają Ci największy
problem lub których potrzebujesz w danej chwili.
Z pewnością jest to dobry sposób na to, aby szukać inspiracji.
Tymczasem drugim sposobem jest też przeglądanie i podglądanie API innych
usług, z którymi będziesz spotykać się projektując własne API.
Wracając jednak do naszego tematu, kolejnym wątkiem, który chciałbym
zaznaczyć raz jeszcze jest security, czyli bezpieczeństwo.
Przede wszystkim musisz pamiętać o tym,
aby zabezpieczyć się na wszelkie wycieki danych.
Mam tutaj na myśli zarówno bardzo
zaawansowane techniki, jak i te najprostsze, sprawdzające czy dane
użytkownik ma dostęp do zasobów, o które prosi.
Chodzi o to, że właśnie te najprostsze
błędy są równie proste do tego, aby je popełnić.
Jeżeli spojrzysz sobie na listę najczęściej spotykanych błędów w security,
to w Top 3 znajdziesz właśnie niezabezpieczone Endpoint API.
Z tego powodu uczulam Cię na to, aby sprawdzać to wielokrotnie.
Tym bardziej, że tutaj wystarczy błędny warunek if czy np.
jakiś błąd typu.
Do tego, aby udostępnić zasoby, których nie chcesz udostępniać.
Kolejnym wątkiem jest sprawdzanie uprawnień.
Mam tutaj na myśli nie tylko sytuację, w
którym Twoje API przewiduje poziomy uprawnień dla użytkowników, ale również
sytuacje, w których tego poziomu uprawnień nie ma.
Chodzi o to, że pokazywałem się sytuacje, w których użytkownik może np.
zmanipulować zapytania i podmienić swój identyfikator w taki sposób, aby np.
zaktualizować rekord, do którego sam nie jest przypisany.
Zatem na tym etapie pamiętaj proszę, aby
nie ufać danym, które przychodzą do Ciebie ze strony klienta.
Czasem te dane mogą być zmanipulowane, a
czasem może to być zwykła pomyłka, która może doprowadzić do dostępu do informacji,
do których dany użytkownik dostępu nie powinien posiadać.
Trzecim punktem jest wykorzystanie HTTPS.
Mam nadzieję, że w tym przypadku nie
trzeba tego podkreślać, tym bardziej, że przeglądarki bardzo mocno utrudniają już
dostęp do osób, które nie są w ten sposób zabezpieczone.
Natomiast i tak warto to brać pod uwagę.
Poza tym, jeżeli projektujesz aplikacje
oraz API, które daje dostęp do bardzo wrażliwych danych, upewnij się, że
wykorzystasz też odpowiedni certyfikat SSL.
W większości przypadków w zupełności wystarczy popularne krypto.
Natomiast w momencie, gdy chcesz zadbać o
wyższy standard bezpieczeństwa, konieczne będzie wykupienie płatnego certyfikatu.
Następnym wątkiem jest right limit i
trolling, czyli nic innego jak limitowanie dostępu do Twojego API.
Teoretycznie może się wydawać, że taki problem może dotyczyć, ponieważ np.
Twoja aplikacja jest zbyt mała na takie problemy.
Okazuje się jednak, że nie do końca musi tak być, ponieważ może zdarzyć się np.
, że użytkownik Twojego API przypadkowo wyśle Ci jakąś dużą liczbę zapytań.
Wtedy może okazać się, że np.
Twój serwer przestanie działać i ucierpią na tym wszyscy inni użytkownicy.
No i jeżeli jesteśmy już przy działaniu naszego API, to wydaje mi się, że ostatnim
wątkiem, które szczególnie powinniśmy brać pod uwagę jest jego stabilność.
Mam tutaj na myśli wykorzystanie testów
automatycznych, które po pierwsze w stopniu podstawowym przejdą przez tak
zwane szczęśliwe ścieżki i sprawdzą, czy nasze API w ogóle odpowiada.
Jednocześnie mamy też HEPA.
Oczywiście, jednak w praktyce takie podstawowe testy to tylko początek.
Warto też uwzględnić tzw.
pozytywny test, czyli dodatkowe sytuacje, w których przekazywane są również
opcjonalne parametry i czy są one odpowiednio respektowane.
Dalej mamy testy, które uwzględniają
zwracanie błędów, ale w przypadku poprawnych danych np.
w momencie, gdy próbujemy zarejestrować użytkownika na to samo konto email
powinien oczywiście otrzymać informację o błędzie.
Takie sytuacje są dość trudne do przewidzenia ze względu na to, że dość
łatwo je pominąć, a jednocześnie dość trudno na nie wpaść.
Po prostu niektóre sytuacje wychodzą w praktyce, ale o tym również można nauczyć
się z wielu źródeł dotyczących testowania rest API.
Kolejnym wątkiem jest testowanie sytuacji,
w których użytkownik wprowadza niewłaściwe dane.
W takiej sytuacji również powinniśmy je
odpowiednio znajdować i też w odpowiedni sposób poinformować użytkownika o tym, co
dokładnie się stało i co może zrobić, aby naprawić ten problem.
O tym, jak go informować już sobie
mówiliśmy, a o tym, jak to robić, będziemy jeszcze mówić.
A tymczasem kolejnym wątkiem, który trzeba
wziąć pod uwagę jest sytuacja, w której użytkownik celowo próbuje wpisać jakieś
informacje, które próbują w różny sposób uszkodzić nasz system.
Co więcej, czasem takie działanie może być celowe, a czasem nie do końca np.
przy wgrywaniu zbyt dużego pliku może okazać się, że nasz serwer będzie próbował
go przetworzyć, o ile nie ustawimy mu odpowiednich limitów.
W związku z tym na takie scenariusze również warto się przygotować.
I warto brać je pod uwagę.
I ostatnim wątkiem jest monitorowanie naszego API i informowanie też
użytkowników o jego aktualnym statusie w formie np.
strony internetowej.
O tym również już mówiliśmy, a
jednocześnie chciałem zwrócić na to uwagę, ponieważ jest to dość ważny aspekt.
Jak widzisz, w przypadku praktycznego projektowania API jest przynajmniej
kilkanaście wątków, które trzeba brać pod uwagę i niestety dość duża część z nich
wymaga posiadania po prostu doświadczenia w projektowaniu API i też umiejętności
odnajdywania się w niestandardowych sytuacjach.
Cała wiedza, którą pozyskasz na temat projektowania API i zastosowania dobrych
praktyk może przydać się w najmniej oczekiwanym momencie.
Jednocześnie musisz pamiętać o tym, że czasem przyjdzie Ci podjąć decyzję, która
będzie wykraczać poza ogólnie przyjęte reguły i wtedy te decyzje powinny
balansować pomiędzy możliwie trzymaniem się standardów a użytecznością Twojego API
oraz elementami związanymi z jego dalszym rozwojem i utrzymaniem.
Mam nadzieję, że ta lekcja pomogła Ci
uchwycić taki bardzo szeroki kontekst projektowania REST API oraz wątków, które
musisz brać pod uwagę zarówno w momencie, gdy pracujesz z takim API oraz w
szczególności gdy samodzielnie je projektujesz.
W tym momencie zostawiam Cię z tymi tematami i do usłyszenia niebawem.