REST API Play keretrendszerrel a Java-ban

1. Áttekintés

Ennek az oktatóanyagnak a célja a Play Framework felfedezése és a REST szolgáltatások felépítésének megismerése a Java segítségével.

Összeállítunk egy REST API-t a hallgatói rekordok létrehozásához, letöltéséhez, frissítéséhez és törléséhez.

Ilyen alkalmazásokban általában rendelkezünk egy adatbázissal a hallgatói nyilvántartások tárolásához. A Play keretrendszer beépített H2 adatbázissal rendelkezik, valamint a hibernált JPA és más perzisztencia keretrendszerek támogatása.

Annak érdekében azonban, hogy a dolgok egyszerűek legyenek, és a legfontosabb dolgokra összpontosítsunk, egyszerű térképet használunk az egyedi azonosítójú diákobjektumok tárolására.

2. Hozzon létre egy új alkalmazást

Miután telepítettük a Play keretrendszert a Play Framework bevezetésében leírtak szerint, készen állunk alkalmazásunk létrehozására.

Használjuk a sbt parancsot egy új alkalmazás létrehozásához hallgató-api felhasználásával játék-java-mag:

sbt új playframework / play-java-seed.g8

3. Modellek

Az alkalmazás állványaival a helyén navigáljunk a hallgató-api / alkalmazás / modellek és hozzon létre egy Java babot a hallgatói információk kezeléséhez:

public class Student {private String keresztnév; privát karakterlánc vezetéknév; privát int kor; private int id; // szabványos kivitelezők, mérőeszközök és beállítók}

Most létrehozunk egy egyszerű adattárolót, amelyet a HashMap - hallgatói adatokhoz, segítő módszerekkel a CRUD műveletek végrehajtásához:

nyilvános osztály StudentStore {privát térképes hallgatók = új HashMap (); public Opcionális addStudent (Student hallgató) {int id = students.size (); hallgató.setId (id); students.put (id, hallgató); return Optional.ofNullable (hallgató) return; } public Opcionális getStudent (int id) {return Optional.ofNullable (students.get (id)); } public set getAllStudents () {return new HashSet (students.values ​​()); } public Opcionális updateStudent (hallgató) {int id = student.getId (); if (hallgatók.tartjaKulcs (id)) {hallgatók. bemenet (id, tanuló); return Optional.ofNullable (hallgató); } return null; } public boolean deleteStudent (int id) {return students.remove (id)! = null; }}

4. Vezérlők

Menjünk át hallgató-api / alkalmazás / kontrollerek és hozzon létre egy új vezérlőt StudentController.java. Fokozatosan lépkedünk át a kódon.

Először is meg kell konfigurálja a HttpExecutionContext. Műveleteinket aszinkron, nem blokkoló kód segítségével hajtjuk végre. Ez azt jelenti, hogy cselekvési módszereink visszatérnek CompletionStage ahelyett, hogy csak Eredmény. Ennek az az előnye, hogy blokkolás nélkül írhatunk hosszú ideig futó feladatokat.

Csak egy figyelmeztetés van, amikor egy aszinkron programozást kezelünk egy Play Framework vezérlőben: meg kell adnunk egy HttpExecutionContext. Ha nem adjuk meg a HTTP végrehajtási kontextust, akkor a művelet metódusának meghívásakor hírhedt hibát kapunk: „Innen nincs elérhető HTTP kontextus”.

Injektáljuk:

privát HttpExecutionContext ec; privát StudentStore studentStore; @ Inject public StudentController (HttpExecutionContext ec, StudentStore studentStore) {this.studentStore = studentStore; ez.ec = ec; }

Figyelem, mi is hozzáadtuk a StudentStore és mindkét mezőt befecskendezte a vezérlő konstruktorába a @ Injekció annotáció. Ezt követően folytathatjuk a cselekvési módszerek megvalósítását.

Vegye figyelembe, hogy Játssz hajókat Jacksonnal az adatfeldolgozás érdekében - így bármilyen szükséges Jackson osztályt külső függőségek nélkül importálhatunk.

Határozzunk meg egy segédosztályt az ismétlődő műveletek végrehajtására. Ebben az esetben HTTP válaszok készítése.

Teremtsünk hát hallgató-api / app / utils csomagoljon és adjon hozzá Util.java benne:

public class Util {public static ObjectNode createResponse (Object response, logikai rendben van) {ObjectNode eredmény = Json.newObject (); result.put ("isSuccessful", ok); if (string példányválasz példánya) {result.put ("test", (Karakterlánc) válasz); } else {eredmény.putPOJO ("test", válasz); } visszatérési eredmény; }}

Ezzel a módszerrel standard JSON válaszokat hozunk létre logikai értékkel isSikeres kulcs és a válasz test.

Most át tudunk lépni a kontroller osztály műveletein.

4.1. A teremt Akció

Feltérképezve a POST művelet, ez a módszer kezeli a Diák tárgy:

public CompletionStage create (Http.Request kérés) {JsonNode json = request.body (). asJson (); return supplyAsync (() -> {if (json == null) {return badRequest (Util.createResponse ("Json-adatok várása", hamis));} Opcionális studentOptional = studentStore.addStudent (Json.fromJson (json, Student.class) )); return studentOptional.map (hallgató -> {JsonNode jsonObject = Json.toJson (hallgató); return létrehozva (Util.createResponse (jsonObject, true));}). vagyElse (internalServerError (Util.createResponse ("Nem sikerült létrehozni) adatok. ", hamis)));}, ec.current ()); }

Hívást használunk az injektált személytől Http. Kérelem osztályba, hogy bekérje a kérő testet Jacksonba JsonNode osztály. Figyelje meg, hogyan használjuk a segédprogram módszerét a válasz létrehozására, ha a test az nulla.

Visszatérünk a CompletionStage, amely lehetővé teszi számunkra, hogy nem blokkoló kódot írjunk a CompletedFuture.supplyAsync módszer.

Bármelyiknek átadhatjuk Húr vagy a JsonNode, valamint a logikai flag jelzi az állapotot.

Vegye figyelembe azt is, hogyan használjuk Json.-tól Json () hogy a bejövő JSON objektumot a Diák objektumot és vissza a JSON-hoz a válaszért.

Végül ahelyett, hogy rendben() amihez hozzászoktunk, használjuk a létre segítő módszer a play.mvc.eredmények csomag. Az ötlet egy olyan módszer használata, amely megadja a helyes HTTP állapotot az adott kontextusban végrehajtott művelethez. Például, rendben() a HTTP OK 200 állapothoz, és létrehozva () amikor a HTTP CREATED 201 az eredmény állapota a fentiek szerint. Ez a koncepció a többi akció során felmerül.

4.2. A frissítés Akció

A PUT kérés // helyi gazda: 9000 / eltalálja a StudentController.frissítés módszer, amely frissíti a hallgatói információkat a updateStudent módszere StudentStore:

public CompletionStage frissítés (Http.Request kérés) {JsonNode json = request.body (). asJson (); return supplyAsync (() -> {if (json == null) {return badRequest (Util.createResponse ("Json-adatok várása", hamis));} Opcionális studentOptional = studentStore.updateStudent (Json.fromJson (json, Student.class) }); return studentOptional.map (student -> {if (student == null) {return notFound (Util.createResponse ("A hallgató nem található", hamis));} JsonNode jsonObject = Json.toJson (hallgató); return ok (Util.createResponse (jsonObject, true));}). VagyElse (internalServerError (Util.createResponse ("Nem sikerült adatokat létrehozni.", Hamis)));}, ec.current ()); }

4.3. A visszahoz Akció

A hallgató beolvasásához a tanuló azonosítóját adjuk meg az a elérési útjának paramétereként KAP kérés // localhost: 9000 /: id. Ez eléri a visszahoz akció:

public CompletionStage retrieve (int id) {return supplyAsync (() -> {final Opcionális studentOptional = studentStore.getStudent (id); return studentOptional.map (hallgató -> {JsonNode jsonObjects = Json.toJson (hallgató); return ok (Util .createResponse (jsonObjects, true));}). vagyElse (notFound (Util.createResponse ("Diák azonosítóval:" + id + "nem található", hamis)));}, ec.current ()); }

4.4. A töröl Akció

A töröl akció leképezve // localhost: 9000 /: id. Mi szállítjuk a id a törlendő rekord azonosítása:

public CompletionStage delete (int id) {return supplyAsync (() -> {logikai állapot = studentStore.deleteStudent (id); if (! status) {return notFound (Util.createResponse ("Diák azonosítóval:" + id + "nem) talált ", hamis));} return ok (Util.createResponse (" Diák azonosítóval: "+ id +" törölve ", igaz));}, ec.current ()); }

4.5. A listaStudents Akció

Végül a listaStudents A művelet visszaadja az összes eddig tárolt tanuló listáját. Fel van térképezve // helyi gazda: 9000 / mint a KAP kérés:

public CompletionStage listStudents () {return supplyAsync (() -> {Set result = studentStore.getAllStudents (); ObjectMapper mapper = new ObjectMapper (); JsonNode jsonData = mapper.convertValue (result, JsonNode.class); return ok (Util. createResponse (jsonData, true));}, ec.current ()); }

5. Térképek

Miután beállítottuk a kontroller műveleteinket, a fájl megnyitásával most feltérképezhetjük őket hallgató-api / conf / útvonalak és hozzáadja ezeket az útvonalakat:

GET / controllers.StudentController.listStudents () GET /: id controllers.StudentController.retrieve (id: Int) POST / controllers.StudentController.create (kérés: Request) PUT / controllers.StudentController.update (kérés: Request) DELETE /: id vezérlők.StudentController.delete (id: Int) GET / assets / * fájlvezérlők.Assets.versioned (elérési út = "/ public", fájl: eszköz)

A / vagyon A statikus erőforrások letöltéséhez a végpontnak mindig jelen kell lennie.

Ezek után elkészültünk a Diák API.

Ha többet szeretne megtudni az útvonal-hozzárendelések meghatározásáról, látogassa meg a Routing in Play Applications oktatóanyagunkat.

6. Tesztelés

Most már teszteket futtathatunk az API-nkon, ha kéréseket küldünk nekik // helyi gazda: 9000 / és hozzáadjuk a megfelelő kontextust. Az alap elérési út futtatásával a böngészőből a következőket kell kiadnia:

{"isSuccessful": igaz, "body": []}

Mint láthatjuk, a törzs üres, mivel még nem adtunk hozzá rekordokat. Használata becsavar, futtassunk néhány tesztet (alternatív megoldásként használhatunk egy REST klienst is, mint a Postman).

Nyissunk meg egy terminálablakot, és hajtsuk végre a curl parancsot adjon hozzá egy diákot:

curl -X POST -H "Tartalom-típus: application / json" \ -d '{"keresztnév": "John", "vezetékNév": "Baeldung", "kor": 18}' \ // localhost: 9000 /

Ez az újonnan létrehozott hallgatót adja vissza:

{"isSuccessful": true, "body": {"firstName": "John", "lastName": "Baeldung", "age": 18, "id": 0}}

A fenti teszt futtatása után betöltés // localhost: 9000 a böngészőből most meg kell adnia:

{"isSuccessful": true, "body": [{"keresztnév": "John", "vezetékNév": "Baeldung", "kor": 18, "id": 0}]} 

A id attribútum növekszik minden hozzáadott új rekordnál.

Nak nek rekord törlése küldünk egy TÖRÖL kérés:

curl -X DELETE // localhost: 9000/0 {"isSuccessful": true, "body": "Diák azonosítóval: 0 törölve"} 

A fenti tesztben töröljük az első tesztben létrehozott rekordot, most nézzük hozza létre újra, hogy tesztelhessük a frissítés módszer:

curl -X POST -H "Tartalom-típus: application / json" \ -d '{"keresztnév": "John", "vezetékNév": "Baeldung", "kor": 18}' \ // localhost: 9000 / {"isSuccessful": true, "body": {"firstName": "John", "lastName": "Baeldung", "age": 18, "id": 0}}

Nézzük most frissítse a rekordot azáltal, hogy az utónevet „Andrew” -ra, életkorát pedig 30-ra állítja:

curl -X PUT -H "Tartalom-típus: application / json" \ -d '{"keresztnév": "Andrew", "vezetékNév": "Baeldung", "kor": 30, "id": 0}' \ // localhost: 9000 / {"isSuccessful": true, "body": {"firstName": "Andrew", "lastName": "Baeldung", "age": 30, "id": 0}}

A fenti teszt bemutatja a keresztnév és kor mezők a rekord frissítése után.

Készítsünk néhány extra dummy rekordot, hozzáadunk kettőt: John Doe és Sam Baeldung:

curl -X POST -H "Tartalom-típus: application / json" \ -d '{"keresztnév": "John", "vezetékNév": "Doe", "age": 18}' \ // localhost: 9000 /
curl -X POST -H "Tartalom-típus: application / json" \ -d '{"keresztnév": "Sam", "vezetékNév": "Baeldung", "kor": 25}' \ // localhost: 9000 /

Most szerezzük be az összes rekordot:

curl -X GET // localhost: 9000 / {"isSuccessful": true, "body": [{"firstName": "Andrew", "lastName": "Baeldung", "age": 30, "id": 0 }, {"keresztnév": "John", "vezetéknév": "Doe", "age": 18, "id": 1}, {"firstName": "Sam", "lastName": "Baeldung", " kor ": 25," id ": 2}]}

A fenti teszt segítségével megállapítjuk a listaStudents vezérlő akció.

7. Következtetés

Ebben a cikkben bemutattuk, hogyan lehet teljes értékű REST API-t létrehozni a Play Framework segítségével.

Szokás szerint az oktatóanyag forráskódja elérhető a GitHubon.