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.
Domyślam się, że masz ogólne pojęcie na temat tego, co dzieje się pomiędzy
klientem a serwerem w momencie wymiany informacji np.
gdy użytkownik wchodzi na stronę i wykonuje jakieś akcje.
Przyjrzyjmy się jednak temu procesowi
nieco bliżej, ponieważ bardzo zależy mi na tym, aby zwrócić Twoją uwagę na kilka
detali, które na ten moment mogą Ci umykać.
Przede wszystkim chciałbym jeszcze zaznaczyć, że będziemy posługiwać się
bardzo prostymi schematami, aby uchwycić tutaj ogólny schemat komunikacji.
Pamiętaj proszę, że każdy z tych etapów
może być bardzo złożony i nawet miejscami się nieco różnić.
Jednocześnie ogólna zasada niemal zawsze
pozostaje taka sama, czyli klient kontaktuje się z serwerem po to, aby
uzyskać jakieś informacje i następnie serwer zwraca te informacje w odpowiednim
formacie do klienta, a ten musi odpowiednio je wyświetlić użytkownikowi.
Zwykle klientem jest tutaj przeglądarka, ale wcale tak być nie musi.
Mianowicie klientem może być też aplikacja desktopowa, bądź chociażby jakieś fizyczne
urządzenie, bądź bardziej oprogramowanie działające na nim.
Jeżeli chodzi o serwer to również tutaj sytuacja może być złożona, ponieważ czasem
może to być serwer dedykowany, czasem może być to wirtualny serwer, a jeszcze innym
razem może być to funkcja działająca w chmurze.
Niezależnie od tego jak wygląda ten schemat i tak ogólna zasada jest taka sama
informacje trafiają z klienta na serwer, gdzie są przetwarzane i w jakiś sposób
przygotowywana jest odpowiedź, która ponownie trafia do klienta i tam jest
odpowiednio interpretowana, a następnie wyświetlana użytkownikowi końcowemu.
I w ten oto sposób odbywa się komunikacja,
której jesteśmy świadkami jako użytkownicy Internetu, a jednocześnie też
przyjdzie nam rozumieć, co tutaj dokładnie dzieje się pod maską.
A dzieje się dość dużo, ponieważ nawet w przypadku bardzo prostej komunikacji, o
której powiedziałem przed chwilą, i tak mamy do czynienia nawet w uproszczeniu z
wieloma krokami, które muszą zostać podjęte.
Zatem zacznijmy od tego, że użytkownik
wpisując pl w swojej przeglądarce oczekuje tego, aby zobaczyć najlepsze dostępne QC.
Zanim to jednak będzie możliwe, w
pierwszej kolejności ten adres musi zostać zamieniony na adres IP.
Coś takiego dzieje się z pomocą rekordów
DNS, które przyjdzie Ci ustawiać w momencie, gdy będziesz konfigurować albo
nowe projekty, albo rozszerzać istniejące o np.
subdomeny. W takiej sytuacji w uproszczeniu mówimy o
połączeniu domeny bądź subdomeny z konkretnym serwerem i to dzieje się
właśnie poprzez dodanie odpowiednich rekordów DNS, które na etapie komunikacji
służą do przetłumaczenia adresu URL na adres IP.
Następnie mamy wspomniany już serwer i tutaj znowu mamy wiele opcji dotyczących
tego, czym konkretnie może być taki serwer.
W większości przypadków są to albo serwery dedykowane tzw.
dedicated server, które jest sprawdza się w przypadku większych aplikacji, ale też
jest odpowiednio droższy lub też wirtualny serwer prywatny, który ja np.
wykorzystuje do wszystkich swoich projektów w ramach usługi digital.
Owszem, w takiej sytuacji fizycznie nie posiadamy dostępu do swojego sprzętu, ale
wszystko jest skonfigurowane w taki sposób, jakbyśmy faktycznie go mieli.
Jest to idealne rozwiązanie, ponieważ mamy
praktycznie pełną kontrolę nad tym, co się dzieje po stronie tego serwera, a
jednocześnie też koszty są odpowiednio niższe.
No i ostatecznie mamy jeszcze serwery współdzielone, w przypadku których cena
jest najniższa, a jednocześnie możliwości zwykle bardzo mocno ograniczone.
W każdym razie to co mogę Ci na tym etapie
polecić to właśnie zainwestowanie nawet kilku dolarów w wirtualny serwer prywatny,
który możesz wykorzystywać na potrzeby nauki bądź jakiś swoich mniejszych
projektów lub też nawet w większości przypadków obsługiwać większe projekty np.
w przypadku Twojego pracodawcę.
Naturalnie tutaj już wchodzimy w obszar
administracji serwerami i z całą pewnością jako full stack.
Nie musisz wiedzieć wszystkiego na ten
temat, ale całkiem dobrym pomysłem jest zdobycie umiejętności, które pozwolą Ci
połączyć się z takim serwerem i wykonać na nim przynajmniej podstawowe operacje.
W moim przypadku po prostu wygląda to tak,
że do samej konfiguracji serwera i jego odpowiedniego ustawienia zwracam się do
jakiejś doświadczonej osoby, która wie co robi w tym temacie, a następnie
przygotowuje mi odpowiednią instrukcję do tego, aby potem móc pracować samodzielnie.
Idąc dalej, w momencie gdy nasze zapytanie trafia do tego serwera, musi zostać
odpowiednio sklasyfikowane i też dostarczone do naszej aplikacji.
I w tym obszarze narzędziami, które wchodzą do gry są tak zwane web serwery.
Najpopularniejsze z nich to Engine i Apache.
Jeżeli chodzi o ich konfigurację, również tutaj można albo polegać na osobie, która
ustawi nam ten serwer, a następnie ewentualnie będziemy modyfikować jego
konfigurację lub też ewentualnie możemy poświęcić chwilę czasu na naukę jej,
która powinna wystarczyć nam do konfiguracji naszych aplikacji.
Do tego tematu będziemy sobie jeszcze wracać i tutaj.
Wracając do głównego wątku jeżeli chodzi o
web serwer, to jego zadaniem jest właśnie klasyfikowanie tego, w które miejsce na
naszym serwerze ma trafić zapytanie pochodzące od użytkownika.
W przypadku Edu Łeba jest to aplikacja stworzona w necie i to właśnie engine
odpowiada za to, aby przekierować do niej zapytanie.
Następnie wewnątrz tej aplikacji również dochodzi między innymi do tzw.
routingu, czyli po prostu podjęcia decyzji o tym, do którego miejsca już wewnątrz
aplikacji ma trafić to konkretne zapytanie.
W większości przypadków zinterpretowania takiego zapytania oraz przygotowanie
odpowiedzi wymaga połączenia z bazą danych w celu pobrania jakiejś informacji i np.
jakiegoś sposobu ich weryfikacji.
Następnie na podstawie tego wszystkiego
aplikacja przygotowuje odpowiedź, która również wraca dokładnie tą samą ścieżką aż
do przeglądarki, gdzie użytkownik z pomocą aplikacji działającej na front endzie
otrzymuje wizualną reprezentację tej informacji.
I teraz upraszczając ten cały proces,
polega on wyłącznie na tym, że użytkownik wpisując jakiś adres w swojej przeglądarce
zostaje połączony z serwerem, na którym działa aplikacja, która interpretuje
zapytanie oraz zwraca odpowiedź użytkownikowi.
Warto jednak tutaj zauważyć, że taka
komunikacja może zostać podzielona na wiele małych fragmentów.
Przykładowo na stronie edu.
PL znajduje się wiele różnych obrazków.
W związku z tym każdy obrazek to tak naprawdę zapytanie do naszego serwera.
Podobnie też jeżeli na tej stronie
znajdują się jakieś dynamiczne elementy, które są pobierane w momencie przeglądania
strony, to również dochodzi tutaj do kolejnych zapytań.
Domyślam się, że masz tego świadomość, jednak trzeba to brać pod uwagę ze względu
na to, że wykonanie każdego z takich zapytań po prostu zajmuje czas.
Z tego powodu z punktu widzenia optymalizacji w niektórych przypadkach
warto połączyć jakieś zapytania w jedno, a w innym przypadku wręcz przeciwnie, np.
w momencie, gdy przejdziemy sobie teraz do katalogu kursów na siebie, to zobaczymy,
że akurat w tym przypadku mamy wyświetlone wszystkie kursy na jednej stronie.
Jednak tak naprawdę kursy są podzielone na kategorie i podkategorie, a to oznacza, że
nie wczytujemy ich wszystkich za jednym razem.
Po prostu w przypadkach, gdy mamy do
czynienia z dużą liczbą danych, znacznie lepszym pomysłem jest podzielenie jej na
kategorie lub też wykorzystanie mechanizmów takich jak tagi.
Do tego, aby uniknąć sytuacji, w której
jakieś zapytanie pobiera zbyt dużą ilość danych, które muszą zostać przetworzone po
stronie klienta i też odpowiednio tam wyświetlone.
W zamian możemy podać tylko kawałek i
tylko w razie potrzeby pobrać kolejne paczki.
Kolejnym bardzo istotnym wątkiem, na który trzeba zwrócić uwagę w przypadku full
stack developmentu jest to, w jaki sposób w ogóle odbywa się komunikacja.
Z punktu widzenia przeglądarki oraz samej aplikacji.
Mianowicie mamy tutaj dwa obrazki
reprezentujące dane przesyłane razem z zapytaniem oraz potem z odpowiedzią.
Zatem jak widzisz, poza faktem, że
wykonujemy tutaj zapytanie na określony adres URL, mamy tutaj do czynienia jeszcze
z metodami HTTP, statusem rekordu, adresami IP czy dodatkowymi informacjami
zapisanych w tak zwanym nagłówku zapytania.
Te wszystkie dane pozwalają komunikować
się albo bezpośrednio z serwerem lub też z naszą aplikacją.
Do tego, aby chociażby była świadoma tego,
w jaki sposób przygotować odpowiedź zwrotną i jednocześnie te wszystkie
informacje, które pozornie stanowią małe detale, takie jak np.
status odpowiedzi, pełnią bardzo ważną rolę z punktu widzenia web developmentu.
Bardzo często zdarza mi się i zakładam, że
Tobie również pracować z API, które nie posługuje się ogólnie przyjętymi
standardami i w rezultacie dochodzi do sytuacji, w których np.
wykonujemy zapytanie do API, które nie zostanie zrealizowane pomyślnie.
Natomiast pomimo tego i tak otrzymujemy
status 200, który sygnalizuje poprawne wykonanie zapytania.
W rezultacie musimy dosłownie domyślać się bądź szukać jakiegoś sposobu na to, aby
odróżnić odpowiedź charakteryzującą pomyślnie wykonane zapytanie od odpowiedzi
na zapytanie, które zostało zrealizowane z błędem.
I tutaj istnieje pewna różnica w momencie, gdy mamy do czynienia z development em.
Różnica polega na tym, że w momencie, gdy
pracujemy wyłącznie na froncie i korzystamy z przygotowanego API, to
zasadniczo nie mamy większej kontroli nad tym, jak to API wygląda w tym przypadku.
Z jednej strony mamy tę kontrolę, ale z drugiej to właśnie na nas ciąży
odpowiedzialność odpowiedniego jego przygotowania.
Tym bardziej, że jeżeli spojrzymy sobie na nagłówki odpowiedzi, to tutaj również
akurat w tym przypadku można teoretycznie stwierdzić, że nie ma tutaj zbyt wielu
istotnych informacji z punktu widzenia developera.
Jednocześnie mamy tutaj elementy, które są
bardzo istotne z punktu widzenia przeglądarki.
Mowa np.
o control, czyli informacji content type, która jest szczególnie ważna w momencie,
gdy pracujemy z API i zwracamy odpowiedzi w różnych formatach, np.
application, styles, Jackson.
Również też odgrywa to istotną rolę w momencie, gdy przesyłamy pliki fizyczne,
gdy przesyłamy pliki takie jak obrazki, bądź też np.
umożliwiamy użytkownikowi wgranie jakiegoś pliku do naszego systemu.
To wszystko odgrywa ogromną rolę zarówno z punktu widzenia frontendu, jak i backendu.
Tak jak powiedziałem,
część z tych elementów będziemy musieli zadbać samodzielnie, a przynajmniej
pamiętać o ich konfiguracji na etapie tworzenia aplikacji.
Dobra wiadomość jest taka, że większość
elementów, które w tym momencie wyświetlają się na ekranie, tak naprawdę
realizowane są automatycznie poprzez frameworki, z którymi przyjdzie nam
pracować, bądź też narzędzia takie jak chociażby Engine EXT.
Ale jednocześnie takie wątki jak metody zapytania, statusy, odpowiedzi, struktura
odpowiedzi, informacja o błędach, typie przekazywanych danych, sposobie kierowania
czy auto rysowania użytkownika oraz uwierzytelnienia połączenia.
To już zostaje w naszych rękach.
Nie przejmuj się, jeżeli na ten moment to wszystko nie jest dla Ciebie jasne.
Ponieważ w kolejnych lekcjach będziemy przyglądać się poszczególnym elementom.
Jednocześnie nie ma też potrzeby, abyśmy
przechodzili przez absolutnie wszystko, ponieważ niektóre elementy są
charakterystyczne typowo dla serwisów takich jak.
Edu.
PL i niekoniecznie za każdym razem musimy zwracać na nie uwagę.
Skupimy się na tym, co jest absolutnie niezbędne do tego, aby zbudować Twój
fundament od zrozumienia sposobu komunikowania się aplikacji i zastosowania
dobrych praktyk, które z całą pewnością będą Ci służyć.
Teraz myślę, że jeszcze ostatnim
elementem, na który warto zwrócić tutaj uwagę jest zakładka Networks w
przeglądarce, z którą z całą pewnością niejednokrotnie przyszło Ci pracować.
Ale też takiej pracy będzie zdecydowanie
więcej w momencie, gdy będziesz pracować jako full stack.
Po prostu z punktu widzenia komunikacji
pomiędzy serwerem a klientem właśnie i zakładka Network oraz Application są
najważniejszymi zaraz po konsoli oraz strukturze DOM elementami.
I tutaj od razu, w momencie, gdy zajrzymy sobie do zakładki Network, widzimy, że na
stronie Web mamy naprawdę dużo zapytań, które składają się tutaj na komunikację.
Rzecz w tym, że uwzględnione są tutaj request nie tylko bezpośrednio do naszego
serwera, ale również zapytania do zewnętrznych usług, takich jak chociażby
Google Analytics czy inne narzędzia analityczne.
Jednocześnie po raz kolejny możemy tutaj eksploatować sobie elementy takie jak np.
Local 103 oraz Session States oraz oczywiście same ciasteczka.
O tym wszystkim będziemy sobie jeszcze rozmawiać, ale naturalnie nie będę Cię
uczył, ponieważ zakładam, że całkiem dobrze je już znasz.
Skupmy się teraz na elemencie dotyczącym
samego ogólnego schematu komunikowania się aplikacji.
Tutaj myślę, że jeszcze dość dobrym pomysłem będzie zajrzenie do Google i
przeszukania kilku grafik zawierających schematy komunikacji różnego rodzaju
aplikacji przy różnych aplikacjach i konfiguracjach.
Przykładowo tutaj mamy jakiś schemat reprezentujący standardową aplikację
webową i w zasadzie jest to dokładnie to, co omówiliśmy przed chwilą.
Jednocześnie w przypadku nieco większych
aplikacji możemy mieć jeszcze do czynienia z tzw.
load balance, którego zasadniczo jest
utrzymanie dużych wolumenów ruchu poprzez rozdzielenie go pomiędzy wieloma
serwerami, które tak jak w tym przypadku mogą współdzielić jedną bazę danych.
Ale oczywiście to też jest tylko schemat,
ponieważ tych baz danych w praktyce również może być więcej.
Przeglądając to wszystko dalej, tutaj mamy
kolejny schemat, który również zasadniczo pokazuje to samo, z tą różnicą, że mamy
tutaj do czynienia z osobą odpowiedzialną za uwierzytelnienie użytkownika i tutaj
też mamy bazę danych, która bezpośrednio z nią współpracuje, a następnie informacje
te wykorzystywane są po stronie web serwera, gdzie możemy decydować, do
których zasobów użytkownik ma dostęp, do których nie.
Następnie też poza samą aplikacją, bądź
też wewnątrz niej możemy mieć do czynienia z osobami odpowiedzialnymi np.
za indeksowanie oraz przeszukiwanie informacji.
Czyli nic innego jak system wyszukiwania.
No i też poza takim systemem możemy mieć serwisy odpowiedzialne za komunikację
mailową, różnego rodzaju powiadomienia, przypomnienia i notyfikacje.
Naturalnie takich usług może być
zdecydowanie więcej i mogą pełnić różne role.
Chodzi mi tutaj o to, aby tylko mieć
świadomość tego, że one istnieją i że mogą pracować ze sobą w różnych konfiguracjach.
To wszystko może zależeć od skali projektu, jakichś problemów, które z
pomocą architektury będziemy chcieli rozwiązać np.
dużego ruchu, bądź też jakiś specyficznych elementów, takich jak np.
celowe odseparowanie części aplikacji, co
może być uzasadnione wyłącznie z punktu widzenia biznesowego.
I teraz jeszcze nie wiem, czy uda mi się tutaj znaleźć jakiś konkretny przykład.
Natomiast w sytuacji, gdy mamy do czynienia z nieco bardziej rozbudowanymi
aplikacjami, do które mogą wchodzić nie tylko load balance,
ale również mechanizmy kierujące, które mogą działać po stronie web serwera i
tutaj mam chociażby na myśli Warning, bądź też na etapie naszej aplikacji.
I tutaj oczko opuszcza nam serwis, bądź też wbudowane mechanizmy kierujące.
Mam nadzieję, że te wszystkie wymienione elementy nie pełnią teraz polegającej na
tym, aby wystraszyć się przed próbą opanowania tego wszystkiego.
Ponieważ prawda jest taka, że nawet jako full stack nie musisz w pełni i bardzo
głęboko posiadać zrozumienia każdego z tych elementów.
Tylko. Wiedzieć, że one istnieją i że w
niektórych sytuacjach przyjdzie Ci z nimi pracować.
Mam nadzieję, że jest to dla ciebie jasne,
więc teraz nie pozostaje mi nic innego, jak zaprosić Cię do kolejnej lekcji.
Dzięki za uwagę i do usłyszenia za chwilę.