Ratpack s Groovyjem

1. Pregled

Ratpack je skup laganih Java knjižnica za izgradnja skalabilnih HTTP aplikacija s reaktivnim, asinkronim i neblokirajućim značajkama.

Uz to, Ratpack također nudi integraciju s tehnologijama i okvirima kao što su Google Guice, Spring Boot, RxJava i Hystrix.

U ovom uputstvu istražit ćemo kako koristiti Ratpack s Groovyjem.

2. Zašto Groovy?

Groovy je moćan, dinamičan jezik koji radi u JVM-u.

Stoga Groovy zaista omogućuje skriptiranje i jezike specifične za domenu. S Ratpackom to omogućuje brzi razvoj web aplikacija.

Ratpack omogućuje jednostavnu integraciju s Groovyjem putem ratpack-groovy i ratpack-groovy-test knjižnice.

3. Aplikacija Ratpack pomoću Groovy skripte

API-ji Ratpack Groovy ugrađeni su u Javi tako da se lako mogu integrirati s Java i Groovy aplikacijama. Dostupni su u ratpack.groovy paket.

Zapravo, u kombinaciji s Groovyjevim mogućnostima skriptiranja i upravljanjem ovisnošću o grožđu, možemo u samo nekoliko redaka brzo stvoriti web aplikaciju s Ratpackom:

@Grab ('io.ratpack: ratpack-groovy: 1.6.1') import static ratpack.groovy.Groovy.ratpack ratpack {handlers {get {render 'Hello World from Ratpack with Groovy !!' }}}

Ovo je naš prvi rukovatelj, obrada GET zahtjeva. Sve što smo morali učiniti bilo je dodati osnovni DSL kako bismo omogućili Ratpack poslužitelj.

Pokrenimo sada ovo kao Groovy skriptu za pokretanje aplikacije. Prema zadanim postavkama aplikacija će biti dostupna na // localhost: 5050:

$ curl -s localhost: 5050 Hello World iz Ratpacka s Groovyjem !!

Također možemo konfigurirati port pomoću ServerConfig:

ratpack {serverConfig {port (5056)}}

Ratpack također nudi značajku vrućeg ponovnog punjenja, što znači da se možemo promijeniti Ratpack.groovy, a zatim vidjeti promjene u trenutku kada aplikacija posluži naš sljedeći HTTP zahtjev.

4. Ratpack-Groovy upravljanje ovisnostima

Postoji nekoliko načina za omogućavanje ratpack-groovy podrška.

4.1. Grožđe

Možemo koristiti Groovyev ugrađeni upravitelj ovisnosti Grape.

Jednostavno je poput dodavanja napomene u naš Ratpack.groovy skripta:

@Grab ('io.ratpack: ratpack-groovy: 1.6.1') import static ratpack.groovy.Groovy.ratpack

4.2. Ovisnost Mavena

Za gradnju u Mavenu, sve što trebamo je dodati ovisnost za ratpack-groovy knjižnica:

 io.ratpack ratpack-groovy $ {ratpack.version} 

4.3. Gradle

Možemo omogućiti ratpack-groovy integracija, dodavanjem Ratpackova dodatka Gradle za Groovy u graditi.gradle:

dodaci {id 'io.ratpack.ratpack-groovy' verzija '1.6.1'}

5. Rukovatelji ratpackom u Groovyju

Rukovatelji pružaju način za obradu web zahtjeva i odgovora. Objektima zahtjeva i odgovora može se pristupiti u ovom zatvaranju.

Web zahtjeve možemo rješavati pomoću HTTP metoda poput GET i POST:

rukovatelji {get ("greet /: name") {ctx -> render "Hello" + ctx.getPathTokens (). get ("name") + "!!!" }} 

Ovaj web zahtjev možemo testirati putem // localhost: 5050 / pozdrav /:

$ curl -s localhost: 5050 / greet / Norman Pozdrav Normane !!!

U kodu rukovatelja, ctx je Kontekst objekt registra koji omogućuje pristup varijablama puta, objektima zahtjeva i odgovora.

Rukovatelji također imaju podršku za rješavanje JSON-a putem Jacksona.

Vratimo JSON, pretvoren iz karte Groovy:

get ("data") {render Jackson.json ([naslov: "Gospodin", ime: "Norman", država: "SAD"])} 
$ curl -s localhost: 5050 / data {"title": "Mr", "name": "Norman", "country": "USA"}

Ovdje, Jackson.json koristi se za pretvorbu.

6. Ratpack obećanja u Groovyju

Kao što znamo, Ratpack omogućuje asinkrone i neblokirajuće značajke u aplikaciji. To se provodi s Ratpack Promises.

Obećanja su slična onima koja se koriste u JavaScript-u i pomalo nalikuju Javi Budućnost. Možemo smisliti a Obećanje kao prikaz vrijednosti koja će biti dostupna u budućnosti:

post ("user") {Promise user = parse (Jackson.fromJson (User)) user.then {u -> render u.name}}

Posljednja akcija ovdje je zatim akcija koja određuje što učiniti s konačnom vrijednošću. U ovom ga slučaju vraćamo kao odgovor na POST.

Razumijemo ovaj kod detaljnije. Ovdje, Jackson.odJson analizira JSON tijela zahtjeva pomoću ObjectMapperKorisnik. Zatim, ugrađeni Kontekst.raščlaniti metoda ga veže na Obećanje objekt.

Obećanje djeluje asinkrono. Kada zatim operacija se na kraju izvodi, vraća se odgovor:

curl -X POST -H 'Content-type: application / json' --data \ '{"id": 3, "title": "Mrs", "name": "Jiney Weiber", "country": "UK "} '\ // localhost: 5050 / zaposlenica Jiney Weiber

Moramo napomenuti da je knjižnica Promise prilično bogata, što nam omogućuje da lančane radnje koristimo funkcijama poput karta i flatMap.

7. Integracija s bazom podataka

Imati asinkrone upravljače najviše koristi kada naši obrađivači moraju pričekati usluge. Pokažimo to integriranjem naše aplikacije Ratpack s H2 bazom podataka.

Možemo koristiti i Ratpackove HikariModule klasa koja je produžetak spremišta veza HikariCP JDBC ili Groovy Sql za integraciju baze podataka.

7.1. HikariModule

Da bismo dodali podršku za HikariCP, dodajmo najprije sljedeće ovisnosti Hikari i H2 maven u našu pom.xml:

 io.ratpack ratpack-hikari $ {ratpack.version} com.h2database h2 $ {h2.version} 

Ili, u naš možemo dodati sljedeće ovisnosti graditi.gradle:

ovisnosti {compile ratpack.dependency ('hikari') compile "com.h2database: h2: $ h2.version"}

Sad ćemo izjaviti HikariModule ispod uvezi zatvaranje bazena veza:

uvoz ratpack.hikari.HikariModule ratpack {vezivanja {modul (HikariModule) {config -> config.dataSourceClassName = 'org.h2.jdbcx.JdbcDataSource' config.addDataSourceProperty ('URL', "jdbc: hDB: de: HDB RUNSCRIPT FROM 'classpath: /User.sql' ")}}} 

Napokon, svi smo spremni za upotrebu za jednostavne operacije baze podataka pomoću Java-a Veza i PreparedStatement:

get ('fetchUserName /: id') {Context ctx -> Connection connection = ctx.get (DataSource.class) .getConnection () PreparedStatement queryStatement = connection.prepareStatement ("SELECT NAME FROM USER WHERE ID =?") queryStatement.setInt (1, Integer.parseInt (ctx.getPathTokens (). Get ("id"))) ResultSet resultSet = queryStatement.executeQuery () resultSet.next () render resultSet.getString (1)} 

Provjerimo radi li obrađivač kako se očekivalo:

$ curl -s localhost: 5050 / fetchUserName / 1 Norman Potter

7.2. Groovy Sql Razred

Možemo koristiti Groovy Sql za brze operacije baze podataka, metodama poput redaka i executeInsert:

get ('fetchUsers') {def db = [url: 'jdbc: h2: mem: devDB'] def sql = Sql.newInstance (db.url, db.user, db.password) def users = sql.rows (" ODABERI * OD KORISNIKA "); render (Jackson.json (korisnici))} 
$ curl -s localhost: 5050 / fetchUsers [{"ID": 1, "TITLE": "Gospodin", "NAME": "Norman Potter", "COUNTRY": "USA"}, {"ID": 2, "TITLE": "Gospođica", "NAME": "Ketty Smith", "COUNTRY": "FRANCE"}]

Napišimo primjer HTTP POST-a sa Sql:

post ('addUser') {parse (Jackson.fromJson (User)). then {u -> def db = [url: 'jdbc: h2: mem: devDB'] Sql sql = Sql.newInstance (db.url, db .user, db.password) sql.executeInsert ("INSERT IN TO USER VRIJEDNOSTI (?,?,?,?)", [u.id, u.title, u.name, u.country]) generiraju "User $ u .ime umetnuto "}}
$ curl -X POST -H 'Tip sadržaja: application / json' --data \ '{"id": 3, "title": "Mrs", "name": "Jiney Weiber", "country": " UK "} '\ // localhost: 5050 / addUser User Jiney Weiber

8. Jedinstveno ispitivanje

8.1. Postavljanje testova

Kao što je već rečeno, Ratpack također nudi ratpack-groovy-test knjižnica za testiranje a ratpack-groovy primjena.

Da bismo ga koristili, možemo ga dodati kao ovisnost o Mavenu u našem pom.xml:

 io.ratpack ratpack-groovy-test 1.6.1 

Alternativno, možemo dodati ovisnost Gradle u našu graditi.gradle:

testCompile ratpack.dependency ('groovy-test')

Tada moramo stvoriti Groovy glavnu klasu RatpackGroovyApp.groovy kako bismo testirali Ratpack.groovy skripta.

javna klasa RatpackGroovyApp {javna statička praznina main (String [] args) {Datoteka datoteke = nova datoteka ("src / main / groovy / com / baeldung / Ratpack.groovy"); def shell = nova GroovyShell () shell.evaluate (datoteka)}}

Prilikom pokretanja Groovy testova kao JUnit testova, razred će pozvati Ratpack.groovy skripta pomoću GroovyShell. Zauzvrat će pokrenuti Ratpack poslužitelj za testiranje.

Sada, napišite našu klasu Groovy Test RatpackGroovySpec.groovy zajedno s kodom za pokretanje Ratpack poslužitelja kroz RatpackGroovyApp:

klasa RatpackGroovySpec {ServerBackedApplicationUnderTest ratpackGroovyApp = novi MainClassApplicationUnderTest (RatpackGroovyApp.class) @Delegate TestHttpClient client = TestHttpClient.testHttpClient (ratpackGroovyA

Ratpack osigurava MainClassApplicationUnderTest za ruganje aplikacijskoj klasi za pokretanje poslužitelja.

8.2. Pisanje naših testova

Napišimo svoje testove, počevši od vrlo osnovnog testa kako bismo provjerili može li se aplikacija pokrenuti:

@Test void "test ako je aplikacija pokrenuta" () {when: get ("") then: assert response.statusCode == 200 assert response.body.text == "Hello World from Ratpack with Groovy !!" }

Napišimo sada još jedan test za provjeru odgovora fetchUsers dobiti voditelja:

@Test void "test fetchUsers" () {when: get ("fetchUsers") then: assert response.statusCode == 200 assert response.body.text == '[{"ID": 1, "TITLE": "Mr. "," NAME ":" Norman Potter "," COUNTRY ":" USA "}, {" ID ": 2," TITLE ":" Miss "," NAME ":" Ketty Smith "," COUNTRY ":" FRANCE "}] '}

Testni okvir Ratpack brine se za pokretanje i zaustavljanje poslužitelja umjesto nas.

9. Zaključak

U ovom smo članku vidjeli nekoliko načina za pisanje HTTP rukovatelja za Ratpack pomoću Groovyja. Također smo istražili obećanja i integraciju baze podataka.

Vidjeli smo kako Groovy zatvara, DSL-ove i Groovy-e Sql čine naš kôd sažetim, učinkovitim i čitljivim. Istodobno, Groovyjeva podrška za testiranje čini jedinstveno i integracijsko testiranje izravnim.

Ovim tehnikama možemo koristiti Groovyjeve dinamičke jezične značajke i izražajne API-je za brzi razvoj visoko učinkovitih, skalabilnih HTTP aplikacija s Ratpackom.

Kao i obično, primjer koda možete pronaći na GitHubu.