REST API s Play Framework v Jave

1. Prehľad

Účelom tohto tutoriálu je preskúmať rámec Play Framework a naučiť sa, ako pomocou neho vytvárať služby REST.

Zostavíme rozhranie REST API na vytváranie, načítanie, aktualizáciu a mazanie záznamov študentov.

V takýchto aplikáciách by sme bežne mali databázu na ukladanie záznamov študentov. Play Framework má vstavanú databázu H2 spolu s podporou JPA s režimom Hibernate a ďalšími perzistenciami.

Aby sme však udržali veci jednoduché a sústredili sa na najdôležitejšie veci, použijeme na ukladanie študentských objektov s jedinečnými ID jednoduchú mapu.

2. Vytvorte novú aplikáciu

Po nainštalovaní rámca Play, ako je popísané v našom úvode do rámca Play, sme pripravení vytvoriť našu aplikáciu.

Použime sbt príkaz na vytvorenie novej aplikácie s názvom študent-api použitím hrať-java-seed:

sbt new playframework / play-java-seed.g8

3. Modely

Po nasadení nášho lešenia poďme na študent-api / aplikácia / modely a vytvorte Java bean na prácu s informáciami o študentoch:

verejná trieda Študent {private String firstName; private String priezvisko; súkromný int vek; private int id; // štandardné konštruktory, getre a setre}

Teraz vytvoríme jednoduché úložisko dát - podporované znakom a HashMap - pre údaje študentov, s pomocnými metódami na vykonávanie operácií CRUD:

verejná trieda StudentStore {private Map students = new HashMap (); public Voliteľné addStudent (študent) {int id = students.size (); student.setId (id); students.put (id, student); návrat Optional.ofNullable (študent); } public Voliteľné getStudent (int id) {návrat Optional.ofNullable (students.get (id)); } public Set getAllStudents () {return new HashSet (students.values ​​()); } public Voliteľné updateStudent (študent) {int id = student.getId (); if (students.containsKey (id)) {students.put (id, student); návrat Optional.ofNullable (študent); } return null; } public boolean deleteStudent (int id) {return students.remove (id)! = null; }}

4. Ovládače

Poďme k tomu študent-api / aplikácia / ovládače a vytvorte nový radič s názvom StudentController.java. Postupne krok za krokom prejdeme kódom.

Najprv musíme nakonfigurovať HttpExecutionContext. Naše akcie implementujeme pomocou asynchrónneho neblokujúceho kódu. To znamená, že sa naše metódy konania vrátia DokončenieStage namiesto iba Výsledok. To má výhodu v tom, že nám umožňuje písať dlho prebiehajúce úlohy bez blokovania.

Pri práci s asynchrónnym programovaním v radiči Play Framework existuje iba jedna výhrada: musíme poskytnúť HttpExecutionContext. Ak nedodáme kontext vykonania protokolu HTTP, pri volaní metódy akcie sa zobrazí neslávna chyba „Odtiaľ nie je k dispozícii žiadny kontext HTTP“.

Poďme to vstreknúť:

private HttpExecutionContext ec; súkromný StudentStore studentStore; @Inject public StudentController (HttpExecutionContext ec, StudentStore studentStore) {this.studentStore = studentStore; this.ec = ec; }

Všimnite si, že sme tiež pridali StudentStore a injektoval obe polia do konštruktora radiča pomocou @Inject anotácia. Po vykonaní tohto kroku môžeme teraz pokračovať v implementácii metód akcie.

Poznač si to Hrajte s Jacksonom, aby ste mohli spracovať údaje - takže môžeme importovať akékoľvek Jacksonove triedy, ktoré potrebujeme, bez externých závislostí.

Definujme triedu nástrojov na vykonávanie opakujúcich sa operácií. V tomto prípade je vytváranie odpovedí HTTP.

Poďme teda tvoriť student-api / app / utils balíček a pridať Util.java v ňom:

public class Util {public static ObjectNode createResponse (Object response, boolean ok) {ObjectNode result = Json.newObject (); result.put ("isSuccessful", ok); if (response instanceof String) {result.put ("body", (String) response); } else {result.putPOJO ("body", odozva); } vrátiť výsledok; }}

Pomocou tejto metódy vytvoríme štandardné odpovede JSON pomocou boolovskej hodnoty je úspešný kľúč a orgán odpovede.

Teraz môžeme prechádzať krokmi triedy ovládačov.

4.1. The vytvoriť Akcia

Mapované ako a POST Táto metóda sa zaoberá vytváraním Študent objekt:

public CompletionStage create (požiadavka Http.Request) {JsonNode json = request.body (). asJson (); return supplyAsync (() -> {if (json == null) {return badRequest (Util.createResponse ("Expending Json data", false));} Optional studentOptional = studentStore.addStudent (Json.fromJson (json, Student.class) )); return studentOptional.map (student -> {JsonNode jsonObject = Json.toJson (student); return created (Util.createResponse (jsonObject, true));}). orElse (internalServerError (Util.createResponse ("Nemohol vytvoriť) údaje. ", false)));}, ec.current ()); }

Používame hovor od injekčných Http.žiadosť triedy dostať telo žiadosti do Jacksonovej JsonNode trieda. Všimnite si, ako používame metódu utility na vytvorenie odpovede, ak je telo nulový.

Vraciame tiež a DokončenieStage, čo nám umožňuje písať neblokujúci kód pomocou CompletedFuture.supplyAsync metóda.

Môžeme k nej odovzdať ktorúkoľvek String alebo a JsonNodespolu s a boolovský vlajka označujúca stav.

Všimnite si tiež, ako používame Json.fromJson () previesť prichádzajúci objekt JSON na a Študent objekt a späť na JSON ako odpoveď.

Nakoniec namiesto ok () na ktoré sme zvyknutí, používame vytvorené pomocná metóda z play.mvc.výsledky balíček. Ide o použitie metódy, ktorá poskytuje správny stav HTTP pre akciu vykonávanú v konkrétnom kontexte. Napríklad, ok () pre stav HTTP OK 200 a vytvorené () keď HTTP CREATED 201 je výsledný stav, ako sa používa vyššie. Táto koncepcia sa objaví vo zvyšku akcií.

4.2. The aktualizovať Akcia

A PUT žiadosť o // localhost: 9000 / zasiahne StudentController.aktualizovať metóda, ktorá aktualizuje informácie o študentovi volaním updateStudent metóda StudentStore:

verejná aktualizácia CompletionStage (požiadavka Http.Request) {JsonNode json = request.body (). asJson (); return supplyAsync (() -> {if (json == null) {return badRequest (Util.createResponse ("Expending Json data", false));} Optional studentOptional = studentStore.updateStudent (Json.fromJson (json, Student.class) )); return studentOptional.map (student -> {if (student == null) {return notFound (Util.createResponse ("Student not found", false));} JsonNode jsonObject = Json.toJson (student); return ok (Util.createResponse (jsonObject, true));}). OrElse (internalServerError (Util.createResponse ("Could not create data.", False)));}, ec.current ()); }

4.3. The načítať Akcia

Na získanie študenta odovzdáme ID študenta ako parameter cesty v a ZÍSKAJTE žiadosť o // localhost: 9000 /: id. Toto zasiahne načítať akcia:

public CompletionStage retrieve (int id) {return supplyAsync (() -> {final Optional studentOptional = studentStore.getStudent (id); return studentOptional.map (student -> {JsonNode jsonObjects = Json.toJson (student); return ok (Util) .createResponse (jsonObjects, true));}). orElse (notFound (Util.createResponse ("Student with id:" + id + "not found", false)));}, ec.current ()); }

4.4. The vymazať Akcia

The vymazať akcia je namapovaná na // localhost: 9000 /: id. Dodávame id určiť, ktorý záznam sa má vymazať:

public CompletionStage delete (int id) {return supplyAsync (() -> {boolean status = studentStore.deleteStudent (id); if (! status) {return notFound (Util.createResponse ("Student with id:" + id + "not found ", false));} return ok (Util.createResponse (" Student with id: "+ id +" deleted ", true));}, ec.current ()); }

4.5. The zoznamStudenti Akcia

Nakoniec zoznamStudenti Akcia vráti zoznam všetkých študentov, ktorí boli doteraz uložení. Je to mapované na // localhost: 9000 / ako ZÍSKAJTE požiadavka:

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. Mapovania

Po nastavení akcií radiča ich teraz môžeme mapovať otvorením súboru študent-api / conf / trasy a pridaním týchto trás:

GET / controllers.StudentController.listStudents () GET /: id controllers.StudentController.retrieve (id: Int) POST / controllers.StudentController.create (request: Request) PUT / controllers.StudentController.update (request: Request) DELETE /: id controllers.StudentController.delete (id: Int) GET / assets / * file controllers.Assets.versioned (path = "/ public", file: Asset)

The /aktíva koncový bod musí byť vždy k dispozícii na stiahnutie statických prostriedkov.

Potom sme dokončili stavbu Študent API.

Ak sa chcete dozvedieť viac o definovaní mapovaní trás, navštívte náš tutoriál Aplikácia Smerovanie v aplikácii Play.

6. Testovanie

Teraz môžeme spúšťať testy na našom API zasielaním požiadaviek na // localhost: 9000 / a pridanie príslušného kontextu. Spustenie základnej cesty z prehliadača by malo mať výstup:

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

Ako vidíme, telo je prázdne, pretože sme zatiaľ nepridali žiadne záznamy. Použitím zvlnenie, poďme spustiť nejaké testy (alternatívne môžeme použiť REST klienta ako Postman).

Poďme otvoriť okno terminálu a vykonať príkaz curl na pridať študenta:

curl -X POST -H "Content-Type: application / json" \ -d '{"firstName": "John", "lastName": "Baeldung", "age": 18}' \ // localhost: 9000 /

Týmto sa vráti novovytvorenému študentovi:

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

Po vykonaní vyššie uvedeného testu sa načítava // localhost: 9000 z prehliadača by nám teraz malo dať:

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

The id atribút sa zvýši pre každý nový záznam, ktorý pridáme.

To vymazať záznam posielame a ODSTRÁNIŤ požiadavka:

curl -X DELETE // localhost: 9000/0 {"isSuccessful": true, "body": "Študent s ID: 0 odstránený"} 

Vo vyššie uvedenom teste odstránime záznam vytvorený v prvom teste, teraz poďme vytvorte ho znova, aby sme mohli otestovať aktualizovať metóda:

curl -X POST -H "Content-Type: application / json" \ -d '{"firstName": "John", "lastName": "Baeldung", "age": 18}' \ // localhost: 9000 / {"isSuccessful": true, "body": {"firstName": "John", "lastName": "Baeldung", "age": 18, "id": 0}}

Poďme teraz aktualizovať záznam nastavením krstného mena na „Andrew“ a veku do 30 rokov:

curl -X PUT -H "Content-Type: application / json" \ -d '{"firstName": "Andrew", "lastName": "Baeldung", "age": 30, "id": 0}' \ // localhost: 9000 / {"isSuccessful": true, "body": {"firstName": "Andrew", "lastName": "Baeldung", "age": 30, "id": 0}}

Vyššie uvedený test demonštruje zmenu hodnoty parametra krstné meno a Vek polia po aktualizácii záznamu.

Vytvorme ďalšie fiktívne záznamy, pridáme dva: John Doe a Sam Baeldung:

curl -X POST -H "Content-Type: application / json" \ -d '{"firstName": "John", "lastName": "Doe", "age": 18}' \ // localhost: 9000 /
curl -X POST -H "Content-Type: application / json" \ -d '{"firstName": "Sam", "lastName": "Baeldung", "age": 25}' \ // localhost: 9000 /

Teraz poďme získať všetky záznamy:

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

Vyššie uvedeným testom zisťujeme správne fungovanie listStudents činnosť kontrolóra.

7. Záver

V tomto článku sme si ukázali, ako zostaviť plnohodnotné rozhranie REST API pomocou rámca Play.

Ako obvykle je zdrojový kód tohto tutoriálu k dispozícii na GitHub.


$config[zx-auto] not found$config[zx-overlay] not found