- Írd le, hogy a HTTP metódusoknak milyen konvencionális jelentése van a REST API-kban.
- Készítsd el egy Spring MVC-beli controller metódus vázát, amelyik a /users URL-en fogad GET kérést, és User objektumok listáját adja vissza a törzsben.
- Ismertess a Spring MVC controllereiben használhatók annotációk közül legalább hármat.
- Milyen részei vannak egy HTTP kérésnek, amelyek meghatározzák a kérést?
- Hogyan lehet megadni, hogy egy metódus milyen HTTP státuszkódot generáljon?
A labor során egy apróhirdetési portál backendjét készítjük el, amely REST API-n képes fogadni a kéréseket webalkalmazától, mobil apptól vagy akár vastagkliens-alkalmazástól. Kliensalkalmazást azonban most nem készítünk, csupán a Postman programmal teszteljük a backendet.
- Töltsük le, és csomagoljuk ki a projekt vázát a tantárgy weboldaláról.
- Indítsuk el az Eclipse fejlesztőkörnyezetet.
- Importáljuk a projektvázat Maven projektjént.
- A projektváz egy Spring Boot alkalmazás, amely induláskor beágyazott HSQL relációs adatbázist indít a memóriában. Az alkalmazásban konfigurálva van a JPA, és van egy Note entitásunk, valamint REST endpointok, hogy szöveges feljegyzéseket vigyünk fel, és tároljunk el az adatbázisban. Ezek majd később törölhetők, egyelőre tanulási célokat szolgálnak, és a későbbi feladathoz szolgálnak támpontul.
- Indítsuk el az alkalmazást!
- Indítsuk el a Postmant a start menüből! A laborvezetővel együtt vizsgáljuk meg a REST elvű kommunikáció működését az adott Node entitással.
- Készítsd el a hirdetések kezeléséhez az
Ad
entitást! Tartalmazza az alábbi adatokat:- Generált azonosító
- Cím
- Leírás
- Ár (int)
- Létrehozás ideje – ez a backendben töltődjön ki
- Készíts egy
AdRepository
osztályt, és ebben valósítdk meg a mentés műveletét! - Készíts egy
AdController
osztályt, és ebben a POST –kérést kezelő metódust, amellyel majd a mentés REST hívással elvégezhető! - A POST-kérés adja vissza a mentés utáni állapotot, a kitöltött azonosítóval és létrehozási idővel!
- Teszteld Postmannel a hirdetésfeladást!
- Készítsd el a keresés adatbázisműveletet az
AdRepository
osztályban, amely minimális és maximális árak alapján adja vissza a találatokat. - Készítsd el az
AdControllerben
a GET-kérést kezelő metódust! A paramétereket request- paraméterekként vegyük át. Az árak megadása legyenopcionális. A minimális ár alapértelmezett érteke 0, a maximálisé pedig 10 000 000. - Teszteld Postmannel a keresést!
- A változtatást fogjuk megvalósítani, de bejelentkezés hiányában nem tudjuk, hogy ki adta fel a hirdetést, tehát ki módosíthatja. Ezért először egy „titkos” kódot kell generálnunk a hirdetések feladásakor. A hirdető ezt visszakapja, és ez alapján lesz majd képes később a hirdetést módosítani.
- Vegyél fel egy új tagváltozót a kódnak az
Ad
entitásba! - Mentéskor generálj egy hat karakter hosszú kódot, és a mentéskor ezt add vissza. Használhatod az alábbi algoritmust:
public class SecretGenerator {
private static final char[] CHARS =
"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".toCharArray();
private static final Random RND = new Random();
public static String generate() {
StringBuffer sb = new StringBuffer();
for(int i = 0; i < 6; i++)
sb.append(CHARS[RND.nextInt(CHARS.length)]);
return sb.toString();
}
}
- Módosítsd a keresést úgy, hogy az
AdControllerben
az eredményhalmaz visszaadása előtt, minden találat kódját nullázd ki, hogy ne adjuk vissza. - Készíts egy metódust az
AdRepository
-ban, amely a módosított hirdetést várja úgy, hogy a titkos kód is ki van benne töltve. A metódus kérdezze le ID alapján a hirdetést, hasonlítsa össze a titkos kódot, és csak akkor végezze el a módosítást, ha egyezik a kód. Visszatérési értékkel vagy kivételdobással jelezheted, ha nem sikeres a módosítás. - Az
AdController
metódusa PUT hívást fogadjon a módosított állapotot pedig a törzsben vegye át. Ha sikeres a módosítás, akkorOK
, ha nem jó a kód, akkorFORBIDDEN
legyen a visszaadott HTTP státusz! - Teszteld Postmannel a módosítást!
- Tegyük lehetővé, hogy a hirdetések tageket is kezelhessenek. Ezek tetszőleges szöveges címkék,
amelyek utalnak a cikk jellegére, pl. "bútor", és egy cikknek tetszőleges számú ilyen címke
megadható. Először egészítsük ki az
Ad
osztályt a megfelelő tagváltozóval, és alkalmazzuk rajta a megfelelő annotációt. - Vezessünk be egy
GET /api/ads/{tag}
endpointot, ahol{tag}
helyére a megfelelő címkét lehet írni, és csak azokat a cikkeket listázza, amelyek rendelkeznek a taggel. (Az útvonalból a tag értékét a metódus paraméterként kapja meg, ezt@PathVariable
annotációval kell ellátni.) - Teszteld Postmannel a funkciót!
- A hirdetéseknek lehessen lejáratot (dátum és idő) megadni. Ehhez először az
Ad
osztályt egészítsük ki egyLocalDateTime
típusú tagváltozóval. Ennek megadása ne legyen kötelező. - A lejáratot úgy tudjuk kezelni, ha periodikusan (pl. percenként) futtatunk egy metódust,
amely átnézi, és törli az összes olyan hirdetést, amelynek a lejárati ideje korábbi, mint
a jelenlegi dátum és idő. Ehhez először az időzítő-szolgáltatásokat kell engedélyezni.
Az
Application
osztályra tegxük rá az@EnableScheduling
annotációt. - Valamelyik Spring komponensben készítsünk egy olyan metódust, amelyen a
@Scheduled(fixedDelay= 6000)
annotációt. Ebben valósítsuk meg a már lejárt hirdetések törlését. - Teszteljük a működést egy rövid lejáratú hirdetés felvitelével!