Introduksjon til Ratpack

1. Oversikt

Ratpack er et sett med JVM baserte biblioteker bygget for moderne dager høyytelses applikasjoner i sanntid. Den er bygget oppå innebygd Netty hendelsesdrevet nettverksmotor og er i full overensstemmelse med det reaktive designmønsteret.

I denne artikkelen lærer vi hvordan du bruker Ratpack, og vi bygger et lite program ved hjelp av det.

2. Hvorfor Ratpack?

De viktigste fordelene med Ratpack:

  • den er veldig lett, rask og skalerbar
  • den bruker mindre minne enn andre rammer som DropWizard; et interessant sammenligningsresultat finner du her
  • siden den er bygget oppå Netty, Ratpack er helt hendelsesdrevet og ikke-blokkerende i naturen
  • den har støtte for Guice avhengighetsstyring
  • omtrent som Vår Støvel, Ratpack har sine egne testbiblioteker for raskt å sette opp testtilfeller

3. Opprette et program

For å forstå hvordan Ratpack fungerer, la oss starte med å lage en liten applikasjon med den.

3.1. Maven avhengigheter

La oss først legge til følgende avhengigheter i vår pom.xml:

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

Du kan sjekke den siste versjonen på Maven Central.

Merk at selv om vi bruker Maven som vårt byggesystem, i henhold til Ratpack-anbefaling, er det bedre å bruke Gradle som et byggeverktøy siden Ratpack har førsteklasses Gradle-støtte via Ratpack’s Gradle-plugin.

Vi kan bruke følgende build Gradle-skript:

buildscript {repositories {jcenter ()} avhengigheter {classpath "io.ratpack: ratpack-gradle: 1.4.5"}} bruk plugin: "io.ratpack.ratpack-java" repositories {jcenter ()} avhengigheter {testCompile 'junit: junit: 4.11 'runtime "org.slf4j: slf4j-simple: 1.7.21"} test {testLogging {events' startet ',' bestått '}} 

3.2. Bygg applikasjonen

Når byggeadministrasjonen vår er konfigurert, må vi opprette en klasse for å starte den innebygde Netty server og bygge en enkel kontekst for å håndtere standardforespørslene:

public class Application {public static void main (String [] args) kaster Unntak {RatpackServer.start (server -> server.handlers (chain -> chain .get (ctx -> ctx.render ("Welcome to Baeldung ratpack !!!) ")))); }}

Som vi kan se, ved å bruke RatpackServer vi kan nå starte serveren (standardport 5050). De håndtere () metoden tar en funksjon som mottar et kjedeobjekt, som kartlegger alle de respektive innkommende forespørslene. Denne “Handler Chain API” brukes til å bygge strategien for responshåndtering.

Hvis vi kjører denne kodebiten og trykker nettleseren på // localhost: 5050, "Velkommen til Baeldung ratpack !!!" skal vises.

På samme måte kan vi kartlegge en HTTP POST-forespørsel.

3.3. Håndtering av URL-bane-parametere

I det neste eksemplet må vi fange noen parametere for URL-stier i applikasjonen vår. I Ratpack bruker vi PathTokens for å fange dem:

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

Her kartlegger vi Navn URL-param. Når en forespørsel som // localhost: 5050 / John ville komme, vil svaret være "Hallo John !!!".

3.4. Forespørsel / svar Header Modification With / Without Filter

Noen ganger må vi endre den innebygde HTTP-responsoverskriften basert på vårt behov. Ratpack har MutableHeaders for å tilpasse utgående svar.

For eksempel må vi endre følgende overskrifter i svaret: Tilgangskontroll-Tillat opprinnelse, Godta-språk, og Godta-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 (" : name ", ctx -> ctx .render (" Hello "+ ctx.getPathTokens (). get (" name ") +" !!! ")));

Ved bruk av MutableHeaders vi setter, setter de tre topptekstene og skyver dem inn i Kjede.

På samme måte kan vi også sjekke innkommende forespørselsoverskrifter:

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

Det samme kan oppnås ved å lage et filter. Ratpack har en Behandler grensesnitt, som kan implementeres for å lage et filter. Den har bare en metode håndtak(), som tar strømmen Kontekst som parameter:

offentlig klasse RequestValidatorFilter implementerer håndterer {@Override offentlig ugyldig håndtak (Context ctx) kaster unntak {MutableHeaders headers = ctx.getResponse (). getHeaders (); headers.set ("Access-Control-Allow-Origin", "*"); ctx.next (); }}

Vi kan bruke dette filteret på følgende måte:

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

3.5. JSON Parser

Ratpack bruker internt raskere-jackson for JSON-parsing. Vi kan bruke Jackson-modulen til å analysere ethvert objekt til JSON.

La oss lage en enkel POJO-klasse som skal brukes til parsing:

offentlig klasse Ansatt {privat Lang id; privat strengetittel; privat strengnavn; // getters og setters}

Her har vi laget en enkel POJO-klasse som heter Ansatt, som har tre parametere: id, tittel, og Navn. Nå skal vi bruke dette Ansatt objekt å konvertere til JSON og returnere det samme når bestemt URL treffes:

Listeansatte = ny ArrayList (); ansatte.add (ny ansatt (1L, "Mr", "John Doe")); ansatte.add (ny ansatt (2L, "Mr", "White Snow")); RatpackServer.start (server -> server.handlers (chain -> chain .get ("data / ansatte", ctx -> ctx.render (Jackson.json (ansatte)))));

Som vi kan se, legger vi til to manuelt Ansatt objekter i en liste og analysere dem som JSON bruker Jackson modul. Så snart / data / ansatte URL er truffet, JSON-objektet vil bli returnert.

Poeng å merke seg her er at vi ikke bruker ObjectMapper i det hele tatt siden Ratpacks Jackson-modul vil gjøre det som er nødvendig i farta.

3.6. In-Memory Database

Ratpack har førsteklasses støtte for databaser i minnet. Den bruker HikariCP for JDBC-tilkobling. For å kunne bruke den, må vi legge til Ratpack's HikariCP-modulavhengighet i pom.xml:

 io.ratpack ratpack-hikari 1.4.5 

Hvis vi bruker Gradle, det samme må legges til i Gradle-byggefilen:

kompilere ratpack. avhengighet ('hikari')

Nå må vi lage en SQL-fil med tabell DDL-setninger, slik at tabellene opprettes så snart serveren er i gang. Vi lager DDL.sql filen i src / main / resources katalogen og legg til noen DDL-setninger i den.

Siden vi bruker H2-database, må vi legge til avhengigheter for det også.

Nå, ved å bruke HikariModule, kan vi initialisere databasen i kjøretiden:

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. Testing

Som nevnt tidligere har Ratpack førsteklasses støtte for jUnit-testtilfeller. Ved å bruke MainClassApplicationUnderTest kan vi enkelt lage testtilfeller og teste sluttpunktene:

@RunWith (JUnit4.class) offentlig klasse ApplicationTest {MainClassApplicationUnderTest appUnderTest = ny MainClassApplicationUnderTest (Application.class); @Test public void givenDefaultUrl_getStaticText () {assertEquals ("Welcome to baeldung ratpack !!!", appUnderTest.getHttpClient (). GetText ("/")); } @Test offentlig ugyldig gittDynamicUrl_getDynamicText () {assertEquals ("Hello dummybot !!!", appUnderTest.getHttpClient (). GetText ("/ dummybot")); } @Test offentlig ugyldighet givenUrl_getListOfEmployee () kaster JsonProcessingException {List ansatte = ny ArrayList (); ObjectMapper mapper = ny ObjectMapper (); ansatte.add (ny ansatt (1L, "Mr", "John Doe")); ansatte.add (ny ansatt (2L, "Mr", "White Snow")); assertEquals (mapper.writeValueAsString (ansatte), appUnderTest.getHttpClient (). getText ("/ data / ansatte")); } @Efter offentlig ugyldig nedleggelse () {appUnderTest.close (); }}

Vær oppmerksom på at vi må avslutte løpeturen manuelt MainClassApplicationUnderTest eksempel ved å ringe Lukk() metode da den unødvendig kan blokkere JVM-ressurser. Derfor har vi brukt @Etter kommentar for å avslutte forekomsten med en gang når testsaken er utført.

5. Konklusjon

I denne artikkelen så vi enkelheten med å bruke Ratpack.

Som alltid er hele kildekoden tilgjengelig på GitHub.


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