Ratpack Groovyvel

1. Áttekintés

A Ratpack egy könnyű Java könyvtárak összessége méretezhető HTTP-alkalmazások építése reaktív, aszinkron és nem blokkoló funkciókkal.

Ezenkívül a Ratpack integrációt biztosít olyan technológiákkal és keretrendszerekkel is, mint a Google Guice, a Spring Boot, az RxJava és a Hystrix.

Ebben az oktatóanyagban feltárjuk hogyan kell használni a Ratpack-ot Groovy-val.

2. Miért Groovy?

A Groovy egy erőteljes, dinamikus nyelv, amely a JVM-ben fut.

Ezért a Groovy nagyon megkönnyíti a szkriptek és a domainspecifikus nyelvek használatát. A Ratpack segítségével ez gyors webalkalmazás-fejlesztést biztosít.

A Ratpack könnyű integrációt biztosít a Groovy-val a ratpack-groovy és ratpack-groovy-teszt könyvtárak.

3. Ratpack alkalmazás Groovy Script használatával

A Ratpack Groovy API-k Java-ban vannak beépítve, így könnyen integrálhatók mind a Java, mind a Groovy alkalmazásokba. Ezek elérhetők a ratpack.groovy csomag.

Valójában a Groovy szkriptelési képességeivel és a Grape függőségkezeléssel kombinálva gyorsan létrehozhatunk egy Ratpack-alapú webalkalmazást néhány sorban:

@Grab ('io.ratpack: ratpack-groovy: 1.6.1') statikus ratpack import.groovy.Groovy.ratpack ratpack {kezelők {get {render "Hello World from Ratpack with Groovy !!" }}}

Ez az első kezelőnk, GET-kérelem kezelése. Csak annyit kellett tennünk, hogy hozzáadtunk néhány alapvető DSL-t a Ratpack szerver engedélyezéséhez.

Most futtassuk ezt Groovy szkriptként az alkalmazás elindításához. Alapértelmezés szerint az alkalmazás elérhető lesz a // localhost: 5050:

$ curl -s localhost: 5050 Hello World a Ratpack-tól, Groovy-val !!

A port használatával is konfigurálható ServerConfig:

ratpack {serverConfig {port (5056)}}

A Ratpack forró újratöltési funkcióval is rendelkezik, ami azt jelenti, hogy megváltozhatunk Ratpack.groovy, majd tekintse meg a változásokat abban a pillanatban, amikor az alkalmazás kiszolgálja a következő HTTP-kérésünket.

4. Ratpack-Groovy függőségkezelés

Az engedélyezésnek több módja van ratpack-groovy támogatás.

4.1. Szőlő

Használhatjuk Groovy beágyazott függőségkezelőjét, Grape-t.

Ez olyan egyszerű, mint annotáció hozzáadása a mi oldalunkhoz Ratpack.groovy forgatókönyv:

@Grab ('io.ratpack: ratpack-groovy: 1.6.1') statikus ratpack importálása.groovy.Groovy.ratpack

4.2. Maven-függőség

A Mavenben történő építkezéshez csak arra van szükség, hogy hozzáadjuk a ratpack-groovy könyvtár:

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

4.3. Gradle

Engedélyezhetjük ratpack-groovy integrációhoz, hozzáadva a Ratpack Gradle plugint a Groovy-hoz épít.gradle:

bővítmények {id 'io.ratpack.ratpack-groovy' verzió '1.6.1'}

5. Ratpack Handlers Groovy-ban

A kezelők lehetőséget nyújtanak a webes kérések és válaszok kezelésére. A kérés és válasz objektumok ebben a bezárásban érhetők el.

A webes kéréseket olyan HTTP módszerekkel kezelhetjük, mint a GET és a POST:

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

A webes kérést keresztül tesztelhetjük // localhost: 5050 / greet /:

$ curl -s localhost: 5050 / üdvözlet / Norman Hello Norman !!!

A kezelő kódjában ctx az a Kontextus nyilvántartási objektum, amely hozzáférést biztosít az útváltozókhoz, a kérelem és a válasz objektumokhoz.

A kezelőknek támogatásuk van a JSON-nal való Jackson-kapcsolattartáshoz is.

Térjünk vissza a JSON-ra, Groovy térképről konvertálva:

get ("data") {render Jackson.json ([cím: "Mr", név: "Norman", ország: "USA"])} 
$ curl -s localhost: 5050 / data {"title": "Mr", "name": "Norman", "country": "USA"}

Itt, Jackson.json az átalakításhoz használják.

6. Ratpack ígéretek Groovy-ban

Mint tudjuk, a Ratpack engedélyezi az alkalmazás aszinkron és nem blokkoló funkcióit. Ezt a Ratpack Promises segítségével valósítják meg.

Az ígéretek hasonlóak a JavaScript-ben használtakhoz, és kissé hasonlítanak a Java-ra Jövő. Gondolhatunk egy Ígéret a jövőben elérhető érték ábrázolásaként:

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

Az utolsó akció itt a azután cselekvés, amely meghatározza, hogy mit kell kezdeni a végső értékkel. Ebben az esetben a POST válaszként visszaküldjük.

Értsük meg részletesebben ezt a kódot. Itt, Jackson.Json-tól elemzi a kéréstest JSON-ját a ObjectMapperFelhasználó. Aztán a beépített Kontextus.elemzés módszer köti a Ígéret tárgy.

Az ígéret aszinkron módon működik. Amikor az azután a műveletet végül végrehajtják, a válasz visszaadódik:

curl -X POST -H 'Tartalomtípus: application / json' --data \ '{"id": 3, "title": "Mrs", "name": "Jiney Weiber", "country": "UK "} '\ // localhost: 5050 / alkalmazott Jiney Weiber

Meg kell jegyeznünk, hogy a Promise könyvtár meglehetősen gazdag, lehetővé téve számunkra a műveletek láncolását a térkép és flatMap.

7. Integráció egy adatbázissal

Az aszinkron kezelőknek akkor van a legnagyobb előnye, ha kezelőinknek meg kell várniuk a szolgáltatásokat. Bemutassuk ezt a Ratpack alkalmazásunk integrálásával egy H2 adatbázissal.

Vagy használhatjuk a Ratpack-okat HikariModule osztály, amely a HikariCP JDBC kapcsolatkészlet vagy a Groovy S kiterjesztéseql adatbázis-integrációhoz.

7.1. HikariModule

A HikariCP támogatás hozzáadásához először adjuk hozzá a következő Hikari és H2 maven függőségeket pom.xml:

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

Vagy hozzáadhatjuk a következő függőségeket a mi épít.gradle:

függőségek {fordítsd össze a ratpack.dependency ('hikari') fordítást "com.h2database: h2: $ h2.verzió"}

Most kijelentjük HikariModule alatt kötések a csatlakozási medence lezárása:

import ratpack.hikari.HikariModule ratpack {bindings {module (HikariModule) {config -> config.dataSourceClassName = 'org.h2.jdbcx.JdbcDataSource' config.addDataSourceProperty ('URL', "jdbc: h2: mem: devDB; INIT = RUNSCRIPT FROM 'classpath: /User.sql' ")}}} 

Végül mindannyian készen állunk arra, hogy egyszerű adatbázis-műveletekhez használja a Java-kat Kapcsolat és PreparedStatement:

get ('fetchUserName /: id') {Context ctx -> Connection connection = ctx.get (DataSource.class) .getConnection () PreparedStatement queryStatement = connection.prepareStatement ("NÉV KIVÁLASZTÁSA A FELHASZNÁLÓTÓL WHERE ID =?") queryStatement.setInt (1, Integer.parseInt (ctx.getPathTokens (). Get ("id")))) ResultSet resultSet = queryStatement.executeQuery () resultSet.next () render resultSet.getString (1)} 

Ellenőrizzük, hogy a kezelő a várt módon működik-e:

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

7.2. Groovy Sql Osztály

Használhatjuk a Groovyt Sql a gyors adatbázis-műveletekhez, például sorok és executeInsert:

get ('fetchUsers') {def db = [url: 'jdbc: h2: mem: devDB'] def sql = Sql.newInstance (db.url, db.user, db.jelszó) def users = sql.rows (" SELECT * FELHASZNÁLÓTÓL "); renderelés (Jackson.json (felhasználók))} 
$ curl -s localhost: 5050 / fetchUsers [{"ID": 1, "TITLE": "Mr", "NAME": "Norman Potter", "COUNTRY": "USA"}, {"ID": 2, "TITLE": "Miss", "NAME": "Ketty Smith", "COUNTRY": "FRANCE"}]

Írjunk egy HTTP POST példát a Sql:

post ('addUser') {parse (Jackson.fromJson (Felhasználó)). akkor {u -> def db = [url: 'jdbc: h2: mem: devDB'] Sql sql = Sql.newInstance (db.url, db .user, db.password) sql.executeInsert ("INSERT INTO USER VALUES (?,?,?,?)", [u.id, u.title, u.name, u.country]) render "Felhasználó $ u .név beillesztve "}}
$ curl -X POST -H 'Tartalomtípus: application / json' --data \ '{"id": 3, "title": "Mrs", "name": "Jiney Weiber", "country": " UK "} '\ // localhost: 5050 / addUser felhasználó Jiney Weiber beillesztve

8. Egység tesztelése

8.1. A tesztek beállítása

Mint megbeszéltük, Ratpack biztosítja a ratpack-groovy-teszt könyvtár részére tesztelés a ratpack-groovy Alkalmazás.

Használatához hozzáadhatjuk Maven-függőségként pom.xml:

 io.ratpack ratpack-groovy-teszt 1.6.1 

Alternatív megoldásként hozzáadhatjuk a Gradle-függőséget a épít.gradle:

testCompile ratpack.dependency ('groovy-teszt')

Ezután létre kell hoznunk egy Groovy főosztályt RatpackGroovyApp.groovy hogy teszteljük a Ratpack.groovy forgatókönyv.

public class RatpackGroovyApp {public static void main (String [] args) {File file = new File ("src / main / groovy / com / baeldung / Ratpack.groovy"); def shell = új GroovyShell () shell.evaluate (fájl)}}

Ha Groovy teszteket futtat JUnit tesztként, az osztály meghívja a Ratpack.groovy szkript használata GroovyShell. Viszont elindítja tesztelésre a Ratpack szervert.

Most írjuk meg a Groovy Test osztályunkat RatpackGroovySpec.groovy a kóddal együtt a Ratpack szerver elindításához a RatpackGroovyApp:

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

Ratpack biztosítja MainClassApplicationUnderTest kigúnyolni az alkalmazás osztályát a szerver indításához.

8.2. Tesztjeink írása

Írjuk meg tesztjeinket, kezdve egy nagyon alap tesztkel, hogy ellenőrizzük, elindulhat-e az alkalmazás:

@Test void "teszt, ha elindul az alkalmazás" () {when: get ("") then: assert response.statusCode == 200 assert response.body.text == "Hello World from Ratpack with Groovy !!" }

Írjunk most egy újabb tesztet a fetchUsers kap kezelő:

@Test void "test fetchUsers" () {mikor: get ("fetchUsers") majd: assert response.statusCode == 200 assert response.body.text == '[{"ID": 1, "TITLE": "Mr "," NÉV ":" Norman Potter "," ORSZÁG ":" USA "}, {" ID ": 2," TITLE ":" Kisasszony "," NÉV ":" Ketty Smith "," ORSZÁG ":" FRANCIAORSZÁG " "}] '}

A Ratpack teszt keretrendszer gondoskodik a szerver elindításáról és leállításáról számunkra.

9. Következtetés

Ebben a cikkben néhány módszert láthattunk a Ratpack HTTP-kezelőinek a Groovy segítségével történő megírására. Felfedeztük az ígéreteket és az adatbázis-integrációt is.

Láttuk, hogy a Groovy bezár, DSL és Groovy Sql tömör, hatékony és olvashatóvá tegye kódunkat. Ugyanakkor a Groovy teszt támogatása egyszerűvé teszi az egységek és az integrációk tesztelését.

Ezekkel a technikákkal felhasználhatjuk a Groovy dinamikus nyelvi jellemzőit és kifejező API-ját a nagy teljesítményű, skálázható HTTP alkalmazások gyors fejlesztésére a Ratpack segítségével.

Szokás szerint a példakód megtalálható a GitHubon.


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