Uvod u Akka HTTP

1. Pregled

U ovom uputstvu, uz pomoć Akkinih modela Actor & Stream, naučit ćemo kako postaviti Akka za stvaranje HTTP API-ja koji pruža osnovne CRUD operacije.

2. Ovisnosti Mavena

Za početak, pogledajmo ovisnosti potrebne za početak rada s Akka HTTP:

 com.typesafe.akka akka-http_2.12 10.0.11 com.typesafe.akka akka-stream_2.12 2.5.11 com.typesafe.akka akka-http-jackson_2.12 10.0.11 com.typesafe.akka akka-http- testkit_2.12 10.0.11 test 

Možemo, naravno, pronaći najnoviju verziju ovih Akka knjižnica na Maven Central.

3. Stvaranje glumca

Kao primjer, izradit ćemo HTTP API koji nam omogućuje upravljanje korisničkim resursima. API će podržavati dvije operacije:

  • stvaranje novog korisnika
  • učitavanje postojećeg korisnika

Prije nego što pružimo HTTP API, trebat ćemo implementirati glumca koji pruža potrebne operacije:

klasa UserActor proširuje AbstractActor {private UserService userService = new UserService (); statički rekviziti rekviziti () {return Props.create (UserActor.class); } @Override public Receive createReceive () {return receiveBuilder () .match (CreateUserMessage.class, handleCreateUser ()) .match (GetUserMessage.class, handleGetUser ()) .build (); } private FI.UnitApply handleCreateUser () {return createUserMessage -> {userService.createUser (createUserMessage.getUser ()); sender () .tell (novo ActionPerformed (String.format ("Korisnik% s stvoren.", createUserMessage.getUser (). getName ())), getSelf ()); }; } private FI.UnitApply handleGetUser () {return getUserMessage -> {sender (). tell (userService.getUser (getUserMessage.getUserId ()), getSelf ()); }; }}

U osnovi, produžujemo SažetakGlumac razredu i provedbi svojih createReceive () metoda.

Unutar createReceive (), mi smo mapiranje vrsta dolaznih poruka metodama koje obrađuju poruke odgovarajuće vrste.

Vrste poruka su jednostavne klase spremnika koje se mogu serirati s nekim poljima koja opisuju određenu operaciju. GetUserMessage i ima jedno polje userId kako bi identificirao korisnika za učitavanje. CreateUserMessage sadrži a Korisnik objekt s korisničkim podacima koji su nam potrebni za stvaranje novog korisnika.

Kasnije ćemo vidjeti kako prevesti dolazne HTTP zahtjeve u ove poruke.

U konačnici, sve poruke prenosimo na Korisnička usluga instance, koja pruža poslovnu logiku neophodnu za upravljanje trajnim korisničkim objektima.

Također, imajte na umu rekviziti() metoda. Dok rekviziti() metoda nije potrebna za produženje SažetakGlumac, dobro će doći kasnije prilikom stvaranja ActorSystem.

Za detaljniju raspravu o glumcima pogledajte naš uvod u Akka glumce.

4. Definiranje HTTP ruta

Imati glumca koji stvarno radi za nas, preostaje nam samo pružiti HTTP API koji našem glumcu delegira dolazne HTTP zahtjeve.

Akka koristi koncept ruta za opisivanje HTTP API-ja. Za svaku operaciju trebamo rutu.

Da bismo stvorili HTTP poslužitelj, proširujemo klasu okvira HttpApp i provesti rute metoda:

klasa UserServer proširuje HttpApp {privatni konačni ActorRef userActor; Timeout timeout = novo Timeout (Duration.create (5, TimeUnit.SECONDS)); UserServer (ActorRef userActor) {this.userActor = userActor; } @Override public Route routes () {return path ("users", this :: postUser) .orElse (path (segment ("users"). Slash (longSegment ()), id -> route (getUser (id)) )); } private Route getUser (Long id) {return get (() -> {CompletionStage user = PatternsCS.ask (userActor, novi GetUserMessage (id), vremensko ograničenje). thenApply (obj -> (Neobvezno) obj); povratak onSuccess (() -> korisnik, izveden -> {if (izvedeni.isPresent ()) povratak završen (StatusCodes.OK, izvedeni.get (), Jackson.marshaller ()); u suprotnom povratak završen (StatusCodes.NOT_FOUND); }); }); } private Route postUser () {return route (post (() -> entity (Jackson.unmarshaller (User.class), user -> {CompletionStage userCreated = PatternsCS.ask (userActor, new CreateUserMessage (user), timeout). thenApply (obj -> (ActionPerformed) obj); return onSuccess (() -> userCreate, izveden -> {return complete (StatusCodes.CREATED, izvedeno, Jackson.marshaller ());});}))); }} 

Sada ovdje postoji prilično velika količina, ali imajte na umu da slijedimo isti obrazac kao i prije operacije mapiranja, ovaj put kao rute. Idemo to malo razbiti.

Unutar getUser (), jednostavno umotamo dolazni korisnički ID u poruku vrste GetUserMessage i proslijedite tu poruku našem userActor.

Nakon što glumac obradi poruku, naUspjeh naziva se rukovatelj, u kojem smo dovršen HTTP zahtjev slanjem odgovora s određenim HTTP statusom i određenim JSON tijelom. Koristimo Jackson Marshalera za serializiranje odgovora koji je dao glumac u JSON niz.

Unutar postUser (), radimo stvari malo drugačije, jer u HTTP zahtjevu očekujemo JSON tijelo. Koristimo entitet () metoda za mapiranje dolaznog JSON tijela u Korisnik objekt prije umotavanja u CreateUserMessage i prenoseći ga našem glumcu. Opet koristimo Jackson za mapiranje između Jave i JSON-a i obrnuto.

Od HttpApp očekuje da pružimo jednu Ruta objekt, kombiniramo obje rute s jednom u okviru rute metoda. Ovdje koristimo staza direktivu za konačno pružanje URL puta na kojem bi naš API trebao biti dostupan.

Obvezujemo rutu koju pruža postUser () do staze / korisnici. Ako dolazni zahtjev nije POST zahtjev, Akka će automatski ući u ili drugo grana i očekujte da put bude / korisnici / a HTTP metoda biti GET.

Ako je HTTP metoda GET, zahtjev će biti proslijeđen na getUser () ruta. Ako korisnik ne postoji, Akka će vratiti HTTP status 404 (Not Found). Ako metoda nije niti POST niti GET, Akka će vratiti HTTP status 405 (Metoda nije dopuštena).

Za više informacija o tome kako definirati HTTP rute s Akka, pogledajte dokumente Akka.

5. Pokretanje poslužitelja

Nakon što stvorimo HttpApp Implementacija kao gore, možemo pokrenuti naš HTTP poslužitelj s nekoliko redaka koda:

javna statička void glavna (String [] args) baca iznimku {ActorSystem system = ActorSystem.create ("userServer"); ActorRef userActor = system.actorOf (UserActor.props (), "userActor"); UserServer poslužitelj = novi UserServer (userActor); server.startServer ("localhost", 8080, sustav); }

Jednostavno stvorimo ActorSystem s jednim glumcem tipa UserActor i pokrenite poslužitelj lokalnihost.

6. Zaključak

U ovom smo članku naučili o osnovama Akka HTTP-a s primjerom koji pokazuje kako postaviti HTTP poslužitelj i izložiti krajnje točke za stvaranje i učitavanje resursa, slično API-ju REST.

Kao i obično, ovdje predstavljeni izvorni kod nalazi se na GitHubu.


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