Izgradnja API-ja sa Spark Java Frameworkom
1. Uvod
U ovom ćemo članku imati kratki uvod u Spark framework. Spark framework je internetski okvir za brzi razvoj nadahnut Sinatra okvirom za Ruby, a izgrađen je oko filozofije Java 8 Lambda Expression, čineći ga manje opširnim od većine aplikacija napisanih u drugim Java okvirima.
Dobar je izbor ako želite imati Node.js poput iskustva pri razvoju web API-ja ili mikrousluga u Javi. Uz Spark možete imati REST API spreman za posluživanje JSON-a u manje od deset redaka koda.
Kratko ćemo započeti s primjerom "Hello World", nakon čega slijedi jednostavni REST API.
2. Ovisnosti Mavena
2.1. Iskreni okvir
Uključite sljedeću ovisnost o Mavenu u svoj pom.xml:
com.sparkjava iskra-jezgra 2.5.4
Najnoviju verziju Sparka možete pronaći na Maven Central.
2.2. Gson knjižnica
Na raznim mjestima u primjeru koristit ćemo Gson knjižnicu za JSON operacije. Da biste uključili Gson u svoj projekt, uključite ovu ovisnost u svoj pom.xml:
com.google.code.gson gson 2.8.0
Najnoviju verziju Gsona možete pronaći na Maven Central.
3. Početak rada s Spark Frameworkom
Pogledajmo osnovne građevne dijelove aplikacije Spark i demonstriramo brzu web uslugu.
3.1. Rute
Web usluge u Spark Javi grade se na rutama i njihovim upravljačima. Rute su bitni elementi u Sparku. Prema dokumentaciji, svaka se ruta sastoji od tri jednostavna dijela - a glagol, a stazai a uzvratiti poziv.
- The glagol je metoda koja odgovara HTTP metodi. Glagolske metode uključuju: dobiti, objaviti, staviti, izbrisati, glavu, trag, povezati, i mogućnosti
- The staza (naziva se i obrazac rute) određuje koji URI (ove) ruta treba slušati i pruža odgovor
- The uzvratiti poziv je funkcija obrađivača koja se poziva za zadani glagol i putanju kako bi generirala i vratila odgovor na odgovarajući HTTP zahtjev. Povratni poziv uzima argumente objekt zahtjeva i objekt odgovora
Ovdje prikazujemo osnovnu strukturu za rutu koja koristi dobiti glagol:
get ("/ your-route-path /", (zahtjev, odgovor) -> {// vaš povratni kôd});
3.2. API Hello World
Stvorimo jednostavnu web uslugu koja ima dvije rute za GET zahtjeve i kao odgovor vraća poruke "Zdravo". Ove rute koriste dobiti metoda, koja je statički uvoz iz klase iskra.Iskra:
uvoz statičke iskre.Spark. *; javna klasa HelloWorldService {public static void main (String [] args) {get ("/ hello", (req, res) -> "Hello, world"); get ("/ hello /: name", (req, res) -> {return "Hello," + req.params (": name");}); }}
Prvi argument dobiti metoda je put za rutu. Prva ruta sadrži statički put koji predstavlja samo jedan URI ("/zdravo").
Put druge rute (“/ Zdravo /: ime”) sadrži rezervirano mjesto za "Ime" parametar, kako je označen predznakom parametra dvotočkom (":"). Ova će se ruta pozvati kao odgovor na GET zahtjeve za URI-je, poput "/ Bok / Joe" i “/ Bok / Mary”.
Drugi argument dobiti metoda je lambda izraz koji daje funkcionalni programski okus ovom okviru.
Lambda izraz ima zahtjev i odgovor kao argumente i pomaže vratiti odgovor. Logiku kontrolera stavit ćemo u lambda izraz za REST API rute, kao što ćemo vidjeti kasnije u ovom vodiču.
3.3. Testiranje API-ja Hello World
Nakon vođenja nastave HelloWorldService kao normalna Java klasa moći ćete pristupiti usluzi na njezinom zadanom priključku 4567 koristeći rute definirane s dobiti gore navedena metoda.
Pogledajmo zahtjev i odgovor za prvu rutu:
Zahtjev:
GET // localhost: 4567 / pozdrav
Odgovor:
Pozdrav svijete
Isprobajmo drugu rutu, prolazeći Ime parametar na putu:
Zahtjev:
GET // localhost: 4567 / hello / baeldung
Odgovor:
Pozdrav, baeldung
Pogledajte kako se postavlja tekst "Baeldung" u URI-ju korišten je za podudaranje s uzorkom rute “/ Zdravo /: ime” - uzrokujući aktiviranje funkcije ručnika za povratni poziv druge rute.
4. Dizajniranje RESTful usluge
U ovom ćemo odjeljku dizajnirati jednostavnu REST web uslugu za sljedeće Korisnik entitet:
korisnik javne klase {id privatnog niza; private String firstName; private String lastName; privatni String e-mail; // konstruktori, getteri i postavljači}
4.1. Rute
Nabrojimo rute koje čine naš API:
- GET / users - dobiti popis svih korisnika
- GET / users /: id - dobiti korisnika s danim ID-om
- POST / users /: id - dodajte korisnika
- PUT / users /: id - uredite određenog korisnika
- OPCIJE / users /: id - provjerite postoji li korisnik s danim id-om
- DELETE / users /: id - izbrišite određenog korisnika
4.2. Korisnička usluga
Ispod je Korisnička usluga sučelje za deklariranje CRUD operacija za Korisnik entitet:
javno sučelje UserService {public void addUser (Korisnički korisnik); javna zbirka getUsers (); javni korisnik getUser (ID niza); javni Korisnik editUser (Korisnički korisnik) baca UserException; public void deleteUser (ID niza); javni logički userExist (ID niza); }
U demonstracijske svrhe pružamo a Karta provedba ovoga Korisnička usluga sučelje u GitHub kodu za simuliranje postojanosti. Možete isporučiti vlastitu implementaciju s bazom podataka i slojem postojanosti po vašem izboru.
4.3. Struktura odgovora JSON
Ispod je JSON struktura odgovora korištenih u našoj REST usluzi:
{status: message: data:}
The status vrijednost polja može biti bilo koja USPJEH ili POGREŠKA. The podaci polje sadržavat će JSON prikaz podataka o povratu, kao što je Korisnik ili zbirka Korisnici.
Kada nema podataka koji se vraćaju ili ako status je POGREŠKA, popunit ćemo poruka polje za prenošenje razloga pogreške ili nedostatka podataka o povratu.
Predstavimo gornju JSON strukturu pomoću Java klase:
javna klasa StandardResponse {privatni statusResponse status; privatna string poruka; privatni podaci JsonElementa; javni StandardResponse (StatusResponse status) {// ...} public StandardResponse (StatusResponse status, String message) {// ...} public StandardResponse (StatusResponse status, JsonElement data) {// ...} // getters and setters }
gdje StatusResponse je nabrajanje definirano na sljedeći način:
javni popis StatusResponse {SUCCESS ("Uspjeh"), ERROR ("Pogreška"); status privatnog niza; // konstruktori, getteri}
5. Implementacija RESTful usluga
Sada ćemo implementirati rute i rukovatelje za naš REST API.
5.1. Izrada kontrolera
Sljedeća Java klasa sadrži rute za naš API, uključujući glagole i staze i obris rukovatelja za svaku rutu:
javna klasa SparkRestExample {public static void main (String [] args) {post ("/ users", (zahtjev, odgovor) -> {// ...}); get ("/ users", (zahtjev, odgovor) -> {// ...}); get ("/ users /: id", (zahtjev, odgovor) -> {// ...}); put ("/ users /: id", (zahtjev, odgovor) -> {// ...}); delete ("/ users /: id", (zahtjev, odgovor) -> {// ...}); opcije ("/ users /: id", (zahtjev, odgovor) -> {// ...}); }}
Potpunu implementaciju svakog voditelja rute pokazat ćemo u sljedećim pododjeljcima.
5.2. Dodaj korisnika
Ispod je post obrađivač odgovora metode koji će dodati a Korisnik:
post ("/ users", (request, response) -> {response.type ("application / json"); User user = novi Gson (). fromJson (request.body (), User.class); userService.addUser (korisnik); vrati novi Gson () .toJson (novi StandardResponse (StatusResponse.SUCCESS));});
Bilješka: U ovom primjeru, JSON-ov prikaz Korisnik objekt se prosljeđuje kao sirovo tijelo POST zahtjeva.
Isprobajmo rutu:
Zahtjev:
POST // localhost: 4567 / users {"id": "1012", "email": "[email protected]", "firstName": "Mac", "lastName": "Mason1"}
Odgovor:
{"status": "USPJEH"}
5.3. Dohvatite sve korisnike
Ispod je dobiti obrađivač odgovora metode koji vraća sve korisnike s Korisnička usluga:
get ("/ users", (request, response) -> {response.type ("application / json"); return new Gson (). toJson (new StandardResponse (StatusResponse.SUCCESS, new Gson () .toJsonTree (userService. getUsers ())));});
Sada testirajmo rutu:
Zahtjev:
GET // localhost: 4567 / korisnici
Odgovor:
{"status": "SUCCESS", "data": [{"id": "1014", "firstName": "John", "lastName": "Miller", "email": "[email protected]"} , {"id": "1012", "firstName": "Mac", "lastName": "Mason1", "email": "[email protected]"}]}
5.4. Dobivanje korisnika putem ID-a
Ispod je dobiti obrađivač odgovora metode koji vraća a Korisnik s danim iskaznica:
get ("/ users /: id", (zahtjev, odgovor) -> {response.type ("application / json"); return new Gson (). toJson (new StandardResponse (StatusResponse.SUCCESS, new Gson () .toJsonTree (userService.getUser (request.params (": id")))));});
Sada testirajmo rutu:
Zahtjev:
GET // localhost: 4567 / users / 1012
Odgovor:
{"status": "SUCCESS", "data": {"id": "1012", "firstName": "Mac", "lastName": "Mason1", "email": "[email protected]"}}
5.5. Uredite korisnika
Ispod je staviti obrađivač odgovora metode, koji uređuje korisnika koji ima iskaznica isporučuje se u obrascu rute:
put ("/ users /: id", (zahtjev, odgovor) -> {response.type ("application / json"); Korisnik toEdit = novi Gson (). fromJson (request.body (), User.class); Korisnik editedUser = userService.editUser (toEdit); if (editedUser! = Null) {return new Gson (). ToJson (new StandardResponse (StatusResponse.SUCCESS, new Gson () .toJsonTree (editedUser)));} else {return new Gson (). ToJson (novi StandardResponse (StatusResponse.ERROR, novi Gson () .toJson ("Korisnik nije pronađen ili pogreška u uređivanju")));}});
Bilješka: U ovom primjeru podaci se prenose u sirovom tijelu POST zahtjeva kao JSON objekt čija se imena svojstava podudaraju s poljima Korisnik objekt koji treba urediti.
Isprobajmo rutu:
Zahtjev:
PUT // localhost: 4567 / users / 1012 {"lastName": "Mason"}
Odgovor:
{"status": "SUCCESS", "data": {"id": "1012", "firstName": "Mac", "lastName": "Mason", "email": "[email protected]"}}
5.6. Izbriši korisnika
Ispod je izbrisati obrađivač odgovora metode, koji će izbrisati Korisnik s danim iskaznica:
delete ("/ users /: id", (zahtjev, odgovor) -> {response.type ("application / json"); userService.deleteUser (request.params (": id")); vrati novi Gson (). toJson (novi StandardResponse (StatusResponse.SUCCESS, "korisnik je izbrisan"));});
Ajmo sada testirati rutu:
Zahtjev:
IZBRIŠI // localhost: 4567 / users / 1012
Odgovor:
{"status": "SUCCESS", "message": "korisnik je izbrisan"}
5.7. Provjerite postoji li korisnik
The mogućnosti metoda je dobar izbor za uvjetnu provjeru. Ispod je mogućnosti obrađivač odgovora metode koji će provjeriti je li a Korisnik s danim iskaznica postoji:
options ("/ users /: id", (zahtjev, odgovor) -> {response.type ("application / json"); vrati novi Gson (). toJson (novi StandardResponse (StatusResponse.SUCCESS, (userService.userExist (zahtjev) .params (": id")))? "Korisnik postoji": "Korisnik ne postoji"));});
Sada testirajmo rutu:
Zahtjev:
OPCIJE // localhost: 4567 / users / 1012
Odgovor:
{"status": "SUCCESS", "message": "Korisnik postoji"}
6. Zaključak
U ovom smo članku imali kratki uvod u Spark okvir za brzi web razvoj.
Ovaj se okvir uglavnom promovira za generiranje mikro usluga u Javi. Node.js programeri s Java znanjem koji žele iskoristiti knjižnice izgrađene na JVM knjižnicama trebaju se osjećati kao kod kuće koristeći ovaj okvir.
Kao i uvijek, sve izvore za ovaj vodič možete pronaći u projektu Github.