Jeśli podobają Ci się moje filmy, to zostaw łapkę w górę i za subskrybuj mój kanał. Zapraszam Cię także do zapoznania się z moimi kursami i warsztatami: 🟢 Kurs Hibernate i JPA - kursy.nullpointerexception.pl/hibernate/ 🟠 Warsztat Architektura Heksagonalna - kursy.nullpointerexception.pl/product/warsztat-architektura-heksagonalna/ 🟢 Kurs Testy Jednostkowe - kursy.nullpointerexception.pl/testy-jednostkowe/ 🟠 Warsztat Architektura Warstwowa - kursy.nullpointerexception.pl/product/warsztat-architektura-warstwowa/
@Okultysta Maciej Jak chcesz takiego klienta wykorzystywać i po co to tak chcesz robić, bo nie rozumiem trochę koncepcji? Co do odpalenia projektu springowego na WildFly czy innym serwerze aplikacji, to wystarczy tylko odpowiednia konfiguracja. Budowanie do wara w springu to też można ustawić w konfiguracji. Zajrzyj do dokumentacji Spring Boota
@Okultysta Maciej Trochę to dziwnie wymyśliłeś moim zdaniem. Postamna używam tylko testowo, a docelowo to mógłbym do api podłączyć frontend w Angilarze lub Reactcie, ewentualnie inną aplikację backendową. Dlaczego chcesz to łączyć w jednej aplikacji? Poza tym JSP to prehistoria. Jak chcesz zrobić aplikację. To może na początek zainteresuje się Springiem MVC i budowaniem aplikacji z Thymeleafem, a później dopiero rób coś z REST API.
@Okultysta Maciej To już Ci pokrótce napisałem wyżej. Zacznij od Spring MVC z Thymeleafem (masz to wszystko skonfigurowane w Spring Boot), później możesz iść w REST API i Angulara. Vaadin, JSP, JSF, Swing, Java FX, to przestarzałe technologie. Mam w planach nagrać o tym vloga, być może już niedługo będzie.
Szczerze? Dawno nie trafiłem na tak spoko tutorial, zazwyczaj jak jakiś był to było mielenie tego samego, jakby każdy z twórców sciągał od drugiego. Dobra robota i tak trzymaj! :)
Super w ogóle, że korzystasz z tej wtyczki intellij która pokazuje skróty, z których korzystasz :) pomaga to rozwijać się i w tym ważnym obszarze korzystania z IDE :D
Hej, próbowałem zrobić coś podobnego u siebie, tylko bez Lomboka i w mojej encji zamiast pola LocalDate mam LocalDateTime i jak coś wysyłam postmanem to wszystko się dodaje spoko poza tym polem LocalDateTime, które się robi nullem, nie wiesz może czemu? 😅
Na dole ekrany pojawia się zielony pasek ze skrótami i nazwą operacji. CTRL + ALT + C (C jak constans), są też inne V - varaiable, P - parameter (oczywiście trzeba używać w odpowiednim kontekście).
A po co wykorzystywać ResponseEntity do zwracania statusów? Jak dla mnie jest to przekomplikowane i tego obiektu powinliśmy wykorzystywać tylko wtedy gdy chcemy dodać jakieś dodatkowe headery np do redirecta a status zwracać za pomocą adnotacji
Jasne, można używać adnotacji. ResponseEntity pozwala oczywiście ustawić dodatkowe headery tak jak pokazuję to w przypadku Location, poza tym korzystając z ResponsEntity możesz zwracać różne statusy warunkowo, robiąc po prostu if/else i raz zwracać jeden status raz drugi (rzadko się przydaje, ale jednak), adnotacja nie daje Ci takich możliwości. Poza tym prawie zawsze korzystam z ResponseEntity, do ustawiania statusów (takie moje przyzwyczajenie), co nie znaczy, że trzeba zawsze robić tak samo, chociaż wiem, że wiele osób też tak robi 😉
Nie wiem, czy nazwałbym go złym. Generalnie temat jest dosyć skomplikowany i trudno go wytłumaczyć w komentarzu. Zacząłem pisać na ten temat artykuł, ale na razie nie mam czasu, żeby go dokończyć... Podsumuję to krótko, Optional został wprowadzony do Javy, żeby "rozwiązać" problem nulla, ale tego problemu nie rozwiązuje, albo nie do końca rozwiązuje, a przy tym wprowadza dodatkowe problemy. Polecam po googlać jak prawidłowo używać Optionala, bo w wielu przypadkach, które widziałem, był on używany, źle (chociaż research też może nie dać Ci jednoznacznej odpowiedzi). Jak nie wiesz jak używać go prawidłowo, to po prostu nie używaj. W serwisie tworzysz swój kod biznesowy i zwracanie Optionala jest raczej słabym rozwiązaniem, w wielu przypadkach lepszym rozwiązaniem będzie zapewnienie domyślnej wartości, jeśli nie ma danych, lub rzucenie wyjątku. Pamiętaj, że to tylko moja opinia i w różnych przypadkach, w różnym kontekście będzie pasowała lub nie. Kontekst ma duże znaczenie.
Załóżmy że przy aktualizowaniu przy pomocy PUT nie potrzebuję tych wszystkich pól, które potrzebuję przy dodawaniu za pomocą POST. Czy muszę tworzyć osobne DTO do dodawania i aktualizowania czy da się to jakoś inaczej zrobić?
@@dawid4853 rzadko się używa, więc się nie zmieścił w filmie. Poza tym można implementować tę metodę dosyć dowolnie, więc musiałbym poświęcić sporo czasu na omówienie jej.
Hej Mateusz, super materiał. Mam pomysł na rozszerzenie tego filmu t.j. dodanie stanowości przez JWT i/lub cachaeowania w Redis. Oczywiście o ile znajdą się siły i chęci. Dzięki :)
Mam kilka pytań odnosnie REST-a 1. Czym się różni PUT od PATCH i jak często lub do czego rozróżnia się te metody? Chodzi mi kiedy chcemy użyć PUT, a kiedy PATCH? 2. Czy na metodzie PUT id musi być zawsze przekazywane w paramsach/query? Dlaczego nie w body razem z przesłanymi danymi? Jest jakieś dosadne uzasadnienie? 3. To samo pytanie tylko dla metody DELETE Z góry dziękuje za merytoryczną odpowiedź!
Ad.1 PATCH jest przeznaczony do częściowej aktualizacji zasobu, PUT do aktualizacji całego zasobu. Tak jest w teorii, bo w praktyce, możesz zaimplementować to tak samo. Powiedzmy że gdybyś chciał zaktualizować PUTem jakiś zasób wtedy musisz podać wszystkie pola w JSON, bo inaczej wyczyścisz te, których nie podasz (będą nullowe). W PATCH możesz podać tylko jedno pole i powinno się zaktualizować tylko to jedno pole. Tak powinieneś to zaimplementować. Ad. 2 REST nie jest specyfikacją, to zalecenia, więc w teorii nie musi. W praktyce możesz to zaimplementować jak chcesz. Możesz przesyłać w encji lub w dto. Do tego musisz zapewnić, że to ID tam będzie. Bo inaczej będziesz tworzyć nowe zasoby, myśląc, że edytujesz jakiś zasób. Chyba że sprawdzisz, czy to id istnieje i wywalisz wyjątek jeśli nie istnieje(w url nie musisz sprawdzać, bo framework sprawdza to za ciebie). Ad. 3 Tutaj lepiej jest przesyłać id w URL, bo inaczej musisz przekazywać encję lub dto. To jest niepotrzebne, łatwiej, krócej, optymalniej jest przesłać ID w URL w tym przypadku. Dzięki za komentarz 😉
A w jaki sposób najlepiej pobierać różnego rodzaju statystki, np. piszemy backend do obsługi zamówień i wydań z magazynu w obrębie jakiejś firmy. Firma posiada kilkanaście działów i co jakiś czas trzeba wyciągnąć statystyki np. ile długopisów z magazynu pobrał jakiś dział w przeliczeniu na jednego pracownika, albo w jakich miesiącach zamawiane jest najwięcej wody. Lub inny przykład - piszemy backend do obsługi rozgrywek w gry planszowe i chcemy wiedzieć w jaką grę użytkownicy najczęściej grali, albo dany użytkownik najczęściej grał, albo potrzebujemy sporządzić wykres który będzie przedstawiał stosunek wygranych do przegranych gier itd.
Cześć, statystyki można zbierać na różne sposoby w zależności od potrzeb. Jak masz jakiś system zamówień, to na początek możesz odczytywać dane z tabel tego systemu (okresowo) i agregować je. I ewentualnie cachować, albo zapisać w jakiejś tabeli z raportami, żeby wielokrotnie nie czytać tych samych danych. Inny sposób to generować eventy do osobnych tabel i robić zapytania po nich i agregować (możesz też zrobić osobny system do tego jak masz dużo danych). W innych przypadkach podobnie. Jeśli danych jest dużo, to warto zrobić osobny system do raportowani, tak żeby nie obciążać dodatkowo, bazy aplikacji. W springu jest moduł aktuator, który pozwala zbierać techniczne metryki, aplikacji. Możesz też go wykorzystać do wystawiania swoich metryk aplikacji. Takie metryki możesz zbierać Prometeuszem i wyświetlać w Grafanie. Jak potrzebujesz statystyk do strony internetowej to skorzystaj z Google Analitics.
mam glupie pytanie. Jesli chodzi o backend z wykorzystaniem firebase to sa 2 mozliwosci : firestore oraz real time database. W real time database wykorzystuje sie komendy z rest api czyli post, get itd... Natomiast w firestore inaczej to wyglada, a do zapisu i odczytu danych nie uzywa sie post ani get, w takim razie tutaj nie mozna juz mowic o REST API, tak?
Chyba chodzi Ci o CQRS, bo tam, ten wzorzec jest wykorzystywany. W sumie różnica jest niewielka w stosunku do zwykłego DTO. Ale przetwarzać command można trochę inaczej. Poza tym CQRSa można implementować na wiele sposobów, więc może to wyglądać różnie. Jak masz jakiś artykuł lub jakiś inny materiał od Allegro to chętnie zerknę.
Zmiłuj się i we wszystkich swoich filmach wyłącz te dzwonki subskrypcji, które doprowadzają mnie do zawału serca. Nikt inny takiej głupoty nie popełnił.
Jeśli podobają Ci się moje filmy, to zostaw łapkę w górę i za subskrybuj mój kanał. Zapraszam Cię także do zapoznania się z moimi kursami i warsztatami:
🟢 Kurs Hibernate i JPA - kursy.nullpointerexception.pl/hibernate/
🟠 Warsztat Architektura Heksagonalna - kursy.nullpointerexception.pl/product/warsztat-architektura-heksagonalna/
🟢 Kurs Testy Jednostkowe - kursy.nullpointerexception.pl/testy-jednostkowe/
🟠 Warsztat Architektura Warstwowa - kursy.nullpointerexception.pl/product/warsztat-architektura-warstwowa/
@Okultysta Maciej Jak chcesz takiego klienta wykorzystywać i po co to tak chcesz robić, bo nie rozumiem trochę koncepcji? Co do odpalenia projektu springowego na WildFly czy innym serwerze aplikacji, to wystarczy tylko odpowiednia konfiguracja. Budowanie do wara w springu to też można ustawić w konfiguracji. Zajrzyj do dokumentacji Spring Boota
@Okultysta Maciej Trochę to dziwnie wymyśliłeś moim zdaniem. Postamna używam tylko testowo, a docelowo to mógłbym do api podłączyć frontend w Angilarze lub Reactcie, ewentualnie inną aplikację backendową. Dlaczego chcesz to łączyć w jednej aplikacji? Poza tym JSP to prehistoria.
Jak chcesz zrobić aplikację. To może na początek zainteresuje się Springiem MVC i budowaniem aplikacji z Thymeleafem, a później dopiero rób coś z REST API.
@Okultysta Maciej To już Ci pokrótce napisałem wyżej. Zacznij od Spring MVC z Thymeleafem (masz to wszystko skonfigurowane w Spring Boot), później możesz iść w REST API i Angulara. Vaadin, JSP, JSF, Swing, Java FX, to przestarzałe technologie. Mam w planach nagrać o tym vloga, być może już niedługo będzie.
Szczerze? Dawno nie trafiłem na tak spoko tutorial, zazwyczaj jak jakiś był to było mielenie tego samego, jakby każdy z twórców sciągał od drugiego. Dobra robota i tak trzymaj! :)
Dzięki 😉
Dawno nie widziałem tak treściwych i wartościowych materiałów na temat springa po polsku :D
Dzięki 😎
Dokładnie!
Super w ogóle, że korzystasz z tej wtyczki intellij która pokazuje skróty, z których korzystasz :) pomaga to rozwijać się i w tym ważnym obszarze korzystania z IDE :D
Dobra robota Mateusz. Nawet jako doświadczony programista dużo wyciągam z Twoich materiałów.
Oby Ci się chciało jak najdłużej bo wracam regularnie :)
Dzięki za miłe słowa 😉
Bardzo przyjemnie się ogląda. Cenna wiedza w pigułce.
Dzięki 😉
Świetny i treściwy film o esencji resta, dzięki wielkie za niego :)
Odkryłam ten kanał wczoraj, cieszę się że tutaj trafiłam, dużo konkretnej wiedzy wytłumaczone w zrozumiały sposób
Dziękuję 😉
Byczq, genialny jest ten film. Podobnie jak wiele innych na twoim kanale :)
świetnie wytłumaczone. Wielkie dzięki.
Kolejny świetny odcinek. Przyda się do prawidłowego projektowania Rest API.
Dzięki Robert 😉
Dzięki Mateusz za kolejny film. Dużo wiedzy w zwartej formie. Pozdrawiam.
Dzięki 😉
Mateusz, jesteś TheBest'ciak 👍🏻💪🏻
super wytłumaczone, dzięki!
Dzięki!
Super materiał ;)
Super materiały nagrywaj więcej🔥🔥🔥
Dzięki 🙂
Hej, próbowałem zrobić coś podobnego u siebie, tylko bez Lomboka i w mojej encji zamiast pola LocalDate mam LocalDateTime i jak coś wysyłam postmanem to wszystko się dodaje spoko poza tym polem LocalDateTime, które się robi nullem, nie wiesz może czemu? 😅
29:45 co to za skrót klawiszowy do tworzenia zmiennej statycznej?
Na dole ekrany pojawia się zielony pasek ze skrótami i nazwą operacji. CTRL + ALT + C (C jak constans), są też inne V - varaiable, P - parameter (oczywiście trzeba używać w odpowiednim kontekście).
A po co wykorzystywać ResponseEntity do zwracania statusów? Jak dla mnie jest to przekomplikowane i tego obiektu powinliśmy wykorzystywać tylko wtedy gdy chcemy dodać jakieś dodatkowe headery np do redirecta a status zwracać za pomocą adnotacji
Jasne, można używać adnotacji. ResponseEntity pozwala oczywiście ustawić dodatkowe headery tak jak pokazuję to w przypadku Location, poza tym korzystając z ResponsEntity możesz zwracać różne statusy warunkowo, robiąc po prostu if/else i raz zwracać jeden status raz drugi (rzadko się przydaje, ale jednak), adnotacja nie daje Ci takich możliwości.
Poza tym prawie zawsze korzystam z ResponseEntity, do ustawiania statusów (takie moje przyzwyczajenie), co nie znaczy, że trzeba zawsze robić tak samo, chociaż wiem, że wiele osób też tak robi 😉
@@matdabski Mi ResponseEntity przydaje się przy wyjątkach, wiadomo, że można to zrobić w inny sposób no ale
@@paweka9149 Jasne 😉
Może jakiś film o poprawnej formie obsługi błędów w rest api?
Myślałem nad tym, być może coś się pojawi
Mam pytanie odnośnie optionala. Bo mówisz, że nie powinniśmy go zwracać w service (50:25). Czy używanie go jest czymś złym?
Nie wiem, czy nazwałbym go złym. Generalnie temat jest dosyć skomplikowany i trudno go wytłumaczyć w komentarzu. Zacząłem pisać na ten temat artykuł, ale na razie nie mam czasu, żeby go dokończyć... Podsumuję to krótko, Optional został wprowadzony do Javy, żeby "rozwiązać" problem nulla, ale tego problemu nie rozwiązuje, albo nie do końca rozwiązuje, a przy tym wprowadza dodatkowe problemy. Polecam po googlać jak prawidłowo używać Optionala, bo w wielu przypadkach, które widziałem, był on używany, źle (chociaż research też może nie dać Ci jednoznacznej odpowiedzi). Jak nie wiesz jak używać go prawidłowo, to po prostu nie używaj. W serwisie tworzysz swój kod biznesowy i zwracanie Optionala jest raczej słabym rozwiązaniem, w wielu przypadkach lepszym rozwiązaniem będzie zapewnienie domyślnej wartości, jeśli nie ma danych, lub rzucenie wyjątku.
Pamiętaj, że to tylko moja opinia i w różnych przypadkach, w różnym kontekście będzie pasowała lub nie. Kontekst ma duże znaczenie.
Załóżmy że przy aktualizowaniu przy pomocy PUT nie potrzebuję tych wszystkich pól, które potrzebuję przy dodawaniu za pomocą POST. Czy muszę tworzyć osobne DTO do dodawania i aktualizowania czy da się to jakoś inaczej zrobić?
Tak powinieneś mieć osobne DTO.
A co z PATCH? Jakieś za i przeciw?
@@dawid4853 rzadko się używa, więc się nie zmieścił w filmie. Poza tym można implementować tę metodę dosyć dowolnie, więc musiałbym poświęcić sporo czasu na omówienie jej.
@@matdabski chętnie obejrzymy :D
Hej Mateusz, super materiał. Mam pomysł na rozszerzenie tego filmu t.j. dodanie stanowości przez JWT i/lub cachaeowania w Redis. Oczywiście o ile znajdą się siły i chęci. Dzięki :)
Dzięki Mikołaj, pomyślę nad tym 😉
i IMO brakuje jeszcze wzmianki o ExceptionHandlerach i ControllerAdvice
@@mikolajmikolaj5436 To już byłoby trochę za dużo na ten materiał. Poza tym to już bardziej temat związany ze Springiem niż z RESTem
Mam kilka pytań odnosnie REST-a
1. Czym się różni PUT od PATCH i jak często lub do czego rozróżnia się te metody? Chodzi mi kiedy chcemy użyć PUT, a kiedy PATCH?
2. Czy na metodzie PUT id musi być zawsze przekazywane w paramsach/query? Dlaczego nie w body razem z przesłanymi danymi? Jest jakieś dosadne uzasadnienie?
3. To samo pytanie tylko dla metody DELETE
Z góry dziękuje za merytoryczną odpowiedź!
Ad.1 PATCH jest przeznaczony do częściowej aktualizacji zasobu, PUT do aktualizacji całego zasobu. Tak jest w teorii, bo w praktyce, możesz zaimplementować to tak samo.
Powiedzmy że gdybyś chciał zaktualizować PUTem jakiś zasób wtedy musisz podać wszystkie pola w JSON, bo inaczej wyczyścisz te, których nie podasz (będą nullowe). W PATCH możesz podać tylko jedno pole i powinno się zaktualizować tylko to jedno pole. Tak powinieneś to zaimplementować.
Ad. 2 REST nie jest specyfikacją, to zalecenia, więc w teorii nie musi. W praktyce możesz to zaimplementować jak chcesz. Możesz przesyłać w encji lub w dto. Do tego musisz zapewnić, że to ID tam będzie. Bo inaczej będziesz tworzyć nowe zasoby, myśląc, że edytujesz jakiś zasób. Chyba że sprawdzisz, czy to id istnieje i wywalisz wyjątek jeśli nie istnieje(w url nie musisz sprawdzać, bo framework sprawdza to za ciebie).
Ad. 3 Tutaj lepiej jest przesyłać id w URL, bo inaczej musisz przekazywać encję lub dto. To jest niepotrzebne, łatwiej, krócej, optymalniej jest przesłać ID w URL w tym przypadku.
Dzięki za komentarz 😉
A w jaki sposób najlepiej pobierać różnego rodzaju statystki,
np. piszemy backend do obsługi zamówień i wydań z magazynu w obrębie jakiejś firmy. Firma posiada kilkanaście działów i co jakiś czas trzeba wyciągnąć statystyki np. ile długopisów z magazynu pobrał jakiś dział w przeliczeniu na jednego pracownika, albo w jakich miesiącach zamawiane jest najwięcej wody.
Lub inny przykład - piszemy backend do obsługi rozgrywek w gry planszowe i chcemy wiedzieć w jaką grę użytkownicy najczęściej grali, albo dany użytkownik najczęściej grał, albo potrzebujemy sporządzić wykres który będzie przedstawiał stosunek wygranych do przegranych gier itd.
Cześć, statystyki można zbierać na różne sposoby w zależności od potrzeb.
Jak masz jakiś system zamówień, to na początek możesz odczytywać dane z tabel tego systemu (okresowo) i agregować je. I ewentualnie cachować, albo zapisać w jakiejś tabeli z raportami, żeby wielokrotnie nie czytać tych samych danych. Inny sposób to generować eventy do osobnych tabel i robić zapytania po nich i agregować (możesz też zrobić osobny system do tego jak masz dużo danych).
W innych przypadkach podobnie. Jeśli danych jest dużo, to warto zrobić osobny system do raportowani, tak żeby nie obciążać dodatkowo, bazy aplikacji.
W springu jest moduł aktuator, który pozwala zbierać techniczne metryki, aplikacji. Możesz też go wykorzystać do wystawiania swoich metryk aplikacji. Takie metryki możesz zbierać Prometeuszem i wyświetlać w Grafanie.
Jak potrzebujesz statystyk do strony internetowej to skorzystaj z Google Analitics.
mam glupie pytanie. Jesli chodzi o backend z wykorzystaniem firebase to sa 2 mozliwosci : firestore oraz real time database. W real time database wykorzystuje sie komendy z rest api czyli post, get itd... Natomiast w firestore inaczej to wyglada, a do zapisu i odczytu danych nie uzywa sie post ani get, w takim razie tutaj nie mozna juz mowic o REST API, tak?
Z tego co widzę w dokumentacji to Firebase udostępnia też REST API. Być może używasz tego api poprzez jakąś bibliotekę?
Jednak nie ma to jak długa forma 👍
Jasne 😉
Jest jakaś szansa na Soap API?
No nie wiem, to już trochę archeologia, a ja raczej wole nowe technologie ;) ale pomyśle, może kiedyś.
Chętnie zobaczyłbym materiał o wykorzystaniu wzorca command w api na wzór jak to robi np. Allegro
Chyba chodzi Ci o CQRS, bo tam, ten wzorzec jest wykorzystywany. W sumie różnica jest niewielka w stosunku do zwykłego DTO. Ale przetwarzać command można trochę inaczej. Poza tym CQRSa można implementować na wiele sposobów, więc może to wyglądać różnie. Jak masz jakiś artykuł lub jakiś inny materiał od Allegro to chętnie zerknę.
Zmiłuj się i we wszystkich swoich filmach wyłącz te dzwonki subskrypcji, które doprowadzają mnie do zawału serca.
Nikt inny takiej głupoty nie popełnił.
ни черта не понял, но спасибо.