Państwowa Wyższa Szkoła Zawodowa w Tarnowie Zakład Informatyki Laboratorium 4 Spring, Maven, Postman, Debugger Prowadzący: Kierunek: Semestr: Rok: Informatyka Zimowy 2
Technologie Technologie / narzędzia będące przedmiotem laboratorium: Projekt PdfGenerator Proszę pobrać aplikację PdfGenerator na dysk własnego komputera. Po rozpakowaniu pliku należy na platformie Bitbucket utworzyć nowe repozytorium. Należy zsynchronizować nowy projekt z repozytorium, które zostało wcześniej utworzone na platformie. Maven Maven jest to narzędzie, które automatyzuje budowę oprogramowania na platformę Java. W projekcie PdfGenerator znajduje się plik pom.xml (Project Object Model). Ten plik łączy projekt w Javie i Mavena. W pliku pom.xml zapisana jest całkowita konfiguracja związana z projektem, opis jak ma być budowany, konfiguracja pluginów itd. Jedyne co musi zawierać plik pom.xml to koordynaty artefaktu czyli groupid (paczka, odwrócona domena), artifactid (przeważnie jest nazwą projektu). Istotne jest to, że do takiego pliku można dodawać zależności (dependencies). Podczas uruchomienia projektu zależności zostaną pobrane i będziemy mogli korzystać z nowych bibliotek w projekcie. W projekcie PdfGenerator w pliku pom.xml została dodana biblioteka itext w celu umożliwienia generowania dokumentów pdf. Biblioteka została pobrana z repozytorium Mavena i skopiowana do pliku pom.xml. 1
Biblioteka itext w repozytorium Mavena. Biblioteka itext dodana do pliku pom.xml. 2
Integracja IntelliJ IDEA z Maven Proszę pobrać archiwum binarne Mavena, a następnie je rozpakować. W menu nawigacyjnym proszę wybrać opcję Add Configuration... Następnie dodajemy konfigurację dla Mavena. Sytuacja została przedstawiona na poniższym screenie: Przechodzimy do zakładki Parameters (Name: spring-boot, Command line: spring-boot:run). 3
Przechodzimy do zakładki General, odznaczamy Use project settings. W Maven home directory dodajemy lokalizację rozpakowanego archiwum binarnego Maven a. Następnie klikamy Apply, OK. 4
Po wstępnej konfiguracji możemy uruchomić projekt z poziomu menu nawigacyjnego. Uruchomienie projektu zostało przedstawione na poniższym screenie: Projekt powinien się zbudować, a w logach powinna być informacja, że serwer uruchomił się. Przykładowy wpis z logów po prawidłowym uruchomieniu: Protokół HTTP HTTP - (Hypertext Transport Protocol) jest protokołem przesyłania dokumentów hipertekstowych. Zadaniem stron WWW jest publikacja danych, a protokół HTTP właśnie to umożliwia. HTTP jest użytecznym protokołem ponieważ udostępnia znormalizowany sposób komunikowania się komputerów ze sobą. Określa on formę żądań (request) klienta (np.: przeglądarka WWW), oraz formę odpowiedzi (response) serwera na te żądania. 5
JSON JOSN - (JavaScript Object Notation) jest lekkim formatem wymiany danych. Format ten jest formatem tekstowym bazującym na podzbiorze JavaScript. Jest formatem niezależnym od konkretnego języka. Przykładowy obiekt user zapisany w formacie JSON: "user": { "id": 7, "firstname": "Tomasz", "lastname": "Nowak", "salary": [{ "year": 2015, "value": 12000, "currency": "PLN" }, { "year": 2016, "value": 33000, "currency": "PLN" }, { "year": 2017, "value": 22000, "currency": "USD" }] } REST REST - jest to akronim od Representational State Transfer. W przypadku REST mamy adresy URL, które są pewnego rodzaju identyfikatorami. Wysyłamy na te adresy zapytania (które mogą być JSONem). To co powinno się wydarzyć jest określone przez użytą metodę protokołu HTTP (metody CRUD zostały zaprezentowane w poniższej tabeli). Odpowiedź serwera może być również w formacie JSON (typ jest zależny od tego jakiego typu odpowiedzi zażyczy sobie klient). Takiego typu API sprawdza się wyśmienicie w przypadku systemów, które powinny być dostępne dla możliwie dużej ilości klientów. 6
Zestawienie standardowych żądań HTTP (metody CRUD) Działanie Żądanie HTTP Działanie usługi Przykład Create POST Umożliwia utworzenie [POST] nowego obiektu http://127.0.0.1:8080/users danych Read GET Umożliwia pobieranie [GET] obiektu danych http://127.0.0.1:8080/users/1 wskazanego w adresie URL Update PUT Umożliwia [PUT] uaktualnienie obiektu http://127.0.0.1:8080/users/2 danych wskazanego w adresie URL Delete DELETE Umożliwia [DELETE] usunięcie obiektu http://127.0.0.1:8080/users/1 danych wskazanego adresie URL Zestawienie podstawowych kodów odpowiedzi HTTP (informacja zwracana przez serwer) Kod Opis Znaczenie 200 OK Zawartość żądanego zasobu 201 Created Zasób został zapisany na serwerze 400 Bad Request Nieprawidłowe zapytanie, żądanie nie może być obsłużone przez serwer z powodu błędnej składni zapytania 404 Not Found Serwer nie odnalazł zasobu według podanego URL 500 Internal Server Error Wewnętrzny błąd serwera, serwer napotkał niespodziewane trudności (jeśli pojawią się nieobsłużone wyjątki w Javie wówczas serwer zwróci taki kod błędu) Postman Postman - jest to wtyczka dla przeglądarki Google Chrome przy pomocy, której można testować żądania HTTP. Proszę dodać aplikację Postman do przeglądarki (link do rozszerzenia) Google Chrome oraz ją 7
uruchomić. Zanim rozpoczniemy pracę z Postmanem należy wcześniej uruchomić projekt PdfGenerator. Po uruchomieniu aplikacji nasz serwer będzie gotowy do działania - informacja o tym czy serwer działa, dostępna będzie po adresem: http://127.0.0.1:8080/api/server-test. Ładne formatowanie JSONa zostało uzyskane po instalacji wtyczki JSONView. W kontrolerze PdfGeneratorApiController znajdują się 3 metody restowe: servertest - testuje działanie serwera, findall - zwraca listę zapisanych plików, createfile - generuje plik PDF i zapisuje go na dysku. Wykonajmy test metody createfile przy pomocy aplikacji Postman. W pierwszej kolejności ustawiamy nagłówki, typ żądania i adres URL (dokładnie tak jak zostało to przedstawione na poniższym screenie): 8
W następnej kolejności ustawiamy Body. Proszę zauważyć, że w Body żądania należy wprowadzić JSONa, który posiada dokładnie takie same nazwy pól jak klasa UserDataDto, która opatrzona jest adnotacją @RequestBody w parametrze metody kontrolera. Następnie klikamy Send. W odpowiedzi serwera powinniśmy dostać kod 201 oraz JSONa z danymi o zapisanym pliku. Sytuację przedstawia poniższy screen: 9
Pozostałe metody kontrolera PdfGeneratorApiController proszę przetestować w własnym zakresie. Adnotacje w Springu Adnotacje są wskazówkami dla Springa jak ma traktować poszczególne pola, metody czy klasy i dzięki temu jest w stanie samodzielnie tworzyć Beany (czyli obiekty, którymi jest w stanie zarządzać). Adnotacje, które dodajemy przed klasę nazywamy w Springu stereotypami. Wyróżniamy cztery podstawowe stereotypy: @Component - używamy najczęściej do klas, które są pomocnicze i nie oferują elementów logiki biznesowej, @Service - wskazuje, że klasa jest serwisem (oferuje logikę biznesową), @Repository - wskazuje, że klasa pozwala na dostęp do danych, @Controller - oznaczamy nią kontrolery. Wstrzykiwanie zależności w Springu (DI) Wstrzykiwanie zależności w springu (w uproszczeniu): @Autowired private FileService fileservice; 10
jest równoważne z: private FileService fileservice = new FileServiceImpl(); Po wstrzyknięciu przy pomocy adnotacji @Autowired obiekt jest gotowy do działania - od razu mamy dostęp do jego metod. Testowanie serwera za pomocą klienta Proszę pobrać aplikację PdfGeneratorClient.jar na dysk własnego komputera oraz ją przetestować. Podczas testów proszę analizować logi serwera. Debugowanie Debugowanie - proces systematycznego redukowania liczby błędów w oprogramowaniu. Debugger w IntelliJ IDEA Proszę ustawić tzw. breakpointy (za pomocą myszy) w klasie ResourceDAO. 11
Przed uruchomieniem aplikacji w trybie debug należy zatrzymać wcześniej uruchomioną aplikację. Następnie wybieramy z menu nawigacyjnego Run ï Debug spring-boot. Przy pomocy aplikacji Postman proszę wywołać usługę findall(), która znajduje się w klasie PdfGeneratorApiController. Po wywołaniu usługi przechodzimy do zintegrowanego środowiska programistycznego. Na powyższym screenie można zwrócić uwagę, że mamy dostęp do zmiennych, które są przetwarzane 12
w pętli. Sam debugger wiele rzeczy wykonuje za nas. Daje nam możliwość sprawdzenia wartości zmiennych oraz czy algorytm został przez nas prawidłowo zaimplementowany (krok po korku). Czy wiesz, że... Czy wiesz, że doświadczeni programiści korzystają z metody gumowej kaczuszki podczas debugowania kodu? Jeśli formalne metody debugowania kodu zawiodą można sięgnąć po nieformalne metody. Nieformalna metoda debugowania kodu: Proszę umieścić gumową kaczkę (lub inny przedmiot nieożywiony) w pobliżu komputera. Następnie należy tłumaczyć (na głos) swojej kaczce kod (linia po linii) jednocześnie omawiając działanie algorytmu, który zaimplementowaliśmy. Podczas takiej konwersacji powinny wyjść na jaw błędy, które popełniliśmy. Metoda uznawana jest za skuteczny sposób na przyśpieszenie rozwiązywania problemów oraz jest wersją myślenia na głos. 13