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.

  1. The glagol je metoda koja odgovara HTTP metodi. Glagolske metode uključuju: dobiti, objaviti, staviti, izbrisati, glavu, trag, povezati, i mogućnosti
  2. The staza (naziva se i obrazac rute) određuje koji URI (ove) ruta treba slušati i pruža odgovor
  3. 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.