Introduktion til Ratpack

1. Oversigt

Ratpack er et sæt af JVM baserede biblioteker bygget til moderne dage højtydende realtidsapplikationer. Den er bygget oven på indlejret Netty begivenhedsdrevet netværksmotor og er fuldt ud kompatibel med det reaktive designmønster.

I denne artikel lærer vi, hvordan du bruger Ratpack, og vi bygger en lille applikation ved hjælp af den.

2. Hvorfor Ratpack?

De største fordele ved Ratpack:

  • den er meget let, hurtig og skalerbar
  • det bruger mindre hukommelse end andre rammer såsom DropWizard; et interessant sammenligningsresultat kan findes her
  • da det er bygget oven på Netty, Ratpack er totalt begivenhedsdrevet og ikke-blokerende
  • det har støtte til Guice afhængighedsstyring
  • meget ligesom Forår Støvle, Ratpack har sine egne testbiblioteker til hurtigt at opsætte testcases

3. Oprettelse af en applikation

For at forstå, hvordan Ratpack fungerer, lad os starte med at oprette en lille applikation med den.

3.1. Maven afhængigheder

Lad os først tilføje følgende afhængigheder i vores pom.xml:

 io.ratpack ratpack-core 1.4.5 io.ratpack ratpack-test 1.4.5 

Du kan tjekke den nyeste version på Maven Central.

Bemærk, at selvom vi bruger Maven som vores build-system, ifølge Ratpack-anbefaling, er det bedre at bruge Gradle som et byggeværktøj, da Ratpack har førsteklasses Gradle-support leveret via Ratpack's Gradle-plugin.

Vi kan bruge følgende build Gradle-script:

buildscript {repositories {jcenter ()} afhængigheder {classpath "io.ratpack: ratpack-gradle: 1.4.5"}} anvend plugin: "io.ratpack.ratpack-java" repositories {jcenter ()} afhængigheder {testCompile 'junit: junit: 4.11 'runtime "org.slf4j: slf4j-simple: 1.7.21"} test {testLogging {begivenheder' startet ',' bestået '}} 

3.2. Opbygning af applikationen

Når vores build management er konfigureret, skal vi oprette en klasse for at starte den integrerede Netty server og opbyg en simpel kontekst til at håndtere standardanmodningerne:

public class Application {public static void main (String [] args) throw Exception {RatpackServer.start (server -> server.handlers (chain -> chain .get (ctx -> ctx.render) "Velkommen til Baeldung ratpack !!! ")))); }}

Som vi kan se, ved hjælp af RatpackServer Vi kan nu starte serveren (standardport 5050). Det håndtering () metode tager en funktion, der modtager et kædeobjekt, som kortlægger alle de respektive indgående anmodninger. Denne "Handler Chain API" bruges til at opbygge strategien for reaktionshåndtering.

Hvis vi kører dette kodestykke og trykker på browseren på // localhost: 5050, "Velkommen til Baeldung ratpack !!!" skal vises.

På samme måde kan vi kortlægge en HTTP POST-anmodning.

3.3. Håndtering af URL-sti-parametre

I det næste eksempel er vi nødt til at fange nogle parametre for URL-sti i vores applikation. I Ratpack bruger vi PathTokens til at fange dem:

RatpackServer.start (server -> server .handlers (chain -> chain .get (": name", ctx -> ctx.render ("Hello" + ctx.getPathTokens (). Get ("name") + "!! ! "))));

Her kortlægger vi navn URL-param. Når en anmodning som // localhost: 5050 / John ville komme, svaret vil være “Hej John !!!”.

3.4. Ændring af anmodning / svar på header med / uden filter

Nogle gange er vi nødt til at ændre den indbyggede HTTP-svarhoved baseret på vores behov. Ratpack har MutableHeaders til at tilpasse udgående svar.

For eksempel er vi nødt til at ændre følgende overskrifter i svaret: Adgangskontrol-Tillad oprindelse, Accept-sprogog Accepter-Charset:

RatpackServer.start (server -> server.handlers (chain -> chain.all (ctx -> {MutableHeaders headers = ctx.getResponse (). GetHeaders (); headers.set ("Access-Control-Allow-Origin", " * "); headers.set (" Accept-Language "," en-us "); headers.set (" Accept-Charset "," UTF-8 "); ctx.next ();}). get (" : navn ", ctx -> ctx .render (" Hej "+ ctx.getPathTokens (). get (" navn ") +" !!! ")));

Ved hjælp af MutableHeaders vi indstiller, indstiller de tre overskrifter og skubber dem ind i Kæde.

På samme måde kan vi også kontrollere de indgående anmodningsoverskrifter:

ctx.getRequest (). getHeaders (). get ("// TODO")

Det samme kan opnås ved at oprette et filter. Ratpack har en Handler interface, som kan implementeres for at oprette et filter. Det har kun en metode håndtere(), der tager strømmen Sammenhæng som parameter:

offentlig klasse RequestValidatorFilter implementerer Handler {@Override public void handle (Context ctx) throw Exception {MutableHeaders headers = ctx.getResponse (). getHeaders (); headers.set ("Access-Control-Allow-Origin", "*"); ctx.next (); }}

Vi kan bruge dette filter på følgende måde:

RatpackServer.start (server -> server.handlers (chain -> chain. All (new RequestValidatorFilter ()) .get (ctx -> ctx.render ("Welcome to baeldung ratpack !!!")))); }

3.5. JSON Parser

Ratpack bruger internt hurtigere-jackson til JSON-parsing. Vi kan bruge Jackson-modulet til at analysere ethvert objekt til JSON.

Lad os oprette en simpel POJO-klasse, der vil blive brugt til parsing:

offentlig klassemedarbejder {privat Lang id; privat streng titel; privat strengnavn; // getters og setters}

Her har vi oprettet en simpel POJO-klasse med navnet Medarbejder, som har tre parametre: id, titelog navn. Nu bruger vi dette Medarbejder objekt til at konvertere til JSON og returnere det samme, når en bestemt URL er ramt:

Liste medarbejdere = ny ArrayList (); ansatte.add (ny medarbejder (1L, "Mr", "John Doe")); ansatte.add (ny medarbejder (2L, "hr.", "hvid sne")); RatpackServer.start (server -> server.handlers (kæde -> kæde .get ("data / medarbejdere", ctx -> ctx.render (Jackson.json (medarbejdere))));

Som vi kan se, tilføjer vi manuelt to Medarbejder objekter på en liste og parser dem som JSON ved hjælp af Jackson modul. Så snart / data / medarbejdere URL er ramt, JSON-objektet returneres.

Punkt at bemærke her er, at vi bruger ikke ObjectMapper overhovedet da Ratpack's Jackson-modul vil gøre det nødvendige i farten.

3.6. In-Memory Database

Ratpack har førsteklasses support til in-memory databaser. Det bruger HikariCP til pooling af JDBC-forbindelser. For at kunne bruge det skal vi tilføje Ratpack's afhængighed af HikariCP-modulet i pom.xml:

 io.ratpack ratpack-hikari 1.4.5 

Hvis vi bruger Gradle, det samme skal tilføjes i Gradle build-filen:

kompilere ratpack.dependency ('hikari')

Nu skal vi oprette en SQL-fil med tabel DDL-udsagn, så tabellerne oprettes, så snart serveren er i gang. Vi opretter DDL.sql fil i src / main / ressourcer bibliotek og tilføj nogle DDL-udsagn til det.

Da vi bruger H2-database, skal vi også tilføje afhængigheder til det.

Nu ved at bruge HikariModule kan vi initialisere databasen ved kørsel:

RatpackServer.start (server -> server.registry (Guice.registry (bindings -> bindings.module (HikariModule.class, config -> {config.setDataSourceClassName ("org.h2.jdbcx.JdbcDataSource"); config.addDataSourceProperty (" URL "," jdbc: h2: mem: baeldung; INIT = RUNSCRIPT FRA 'classpath: /DDL.sql' ");}))). Handlers (...));

4. Testning

Som tidligere nævnt har Ratpack førsteklasses support til jUnit-testsager. Ved at bruge MainClassApplicationUnderTest kan vi nemt oprette testcases og teste slutpunkterne:

@RunWith (JUnit4.class) offentlig klasse ApplicationTest {MainClassApplicationUnderTest appUnderTest = ny MainClassApplicationUnderTest (Application.class); @Test offentlig ugyldighed givenDefaultUrl_getStaticText () {assertEquals ("Velkommen til baeldung ratpack !!!", appUnderTest.getHttpClient (). GetText ("/")); } @ Test offentligt ugyldigt givenDynamicUrl_getDynamicText () {assertEquals ("Hello dummybot !!!", appUnderTest.getHttpClient (). GetText ("/ dummybot")); } @ Test offentlig ugyldighed givenUrl_getListOfEmployee () kaster JsonProcessingException {List medarbejdere = ny ArrayList (); ObjectMapper-kortlægger = ny ObjectMapper (); ansatte.add (ny medarbejder (1L, "Mr", "John Doe")); ansatte.add (ny medarbejder (2L, "hr.", "hvid sne")); assertEquals (mapper.writeValueAsString (medarbejdere), appUnderTest.getHttpClient (). getText ("/ data / medarbejdere")); } @Efter offentlig ugyldig nedlukning () {appUnderTest.close (); }}

Bemærk, at vi skal manuelt afslutte kørslen MainClassApplicationUnderTest eksempel ved at ringe til tæt() metode, da det unødigt kan blokere JVM-ressourcer. Derfor har vi brugt @Efter kommentar til at afslutte forekomsten med en gang, når testsagen er udført.

5. Konklusion

I denne artikel så vi enkelheden ved at bruge Ratpack.

Som altid er den fulde kildekode tilgængelig på GitHub.


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