Bevezetés a RESTX-be

1. Áttekintés

Ebben az oktatóanyagban bemutatjuk a könnyű Java REST RESTX keretrendszert.

2. Jellemzők

A RESTful API létrehozása meglehetősen egyszerű a RESTX keretrendszerrel. Minden olyan alapértelmezett értékkel rendelkezik, amelyet elvárhatunk egy REST keretrendszertől, például a JSON kiszolgálása és elfogyasztása, a lekérdezési és útvonal-paraméterek, az útválasztási és szűrési mechanizmusok, a használati statisztikák és a figyelés.

A RESTX egy intuitív rendszergazdai webkonzolt és parancssori telepítőt is tartalmaz a könnyű indításhoz.

Ezenkívül az Apache License 2 alatt licencelt és egy fejlesztői közösség fenntartja. A RESTX minimális Java-követelménye a JDK 7.

3. Konfiguráció

A RESTX egy praktikus shell / parancs alkalmazással rendelkezik, amely hasznos egy Java projekt gyors indításához.

A folytatáshoz először telepítenünk kell az alkalmazást. A részletes telepítési útmutató itt érhető el.

4. Az alapvető beépülő modulok telepítése

Itt az ideje, hogy telepítse az alapvető beépülő modulokat, hogy a héjból létrehozhasson egy alkalmazást.

Futtassuk a következő parancsot a RESTX héjban:

shell telepítése

Ezután felszólít minket a beépülő modulok kiválasztására a telepítéshez. Ki kell választanunk a számot, amelyre mutat io.restx: restx-core-shell. A telepítés befejezése után a shell automatikusan újraindul.

5. Shell App Bootstrap

A RESTX shell használatával nagyon kényelmes egy új alkalmazást indítani. Varázsló alapú útmutatót nyújt.

Kezdjük azzal, hogy a következő parancsot hajtjuk végre a shellen:

alkalmazás új

Ez a parancs elindítja a varázslót. Ezután választhatunk az alapértelmezett beállításokkal, vagy megváltoztathatjuk őket a követelményeinknek megfelelően:

Mivel úgy döntöttünk, hogy létrehozunk egy pom.xml, a projekt könnyen importálható bármilyen szabványos Java IDE-be.

Néhány esetben szükség lehet az IDE-beállítások módosítására.

A következő lépés a projekt megépítése lesz:

mvn clean install -DskipTests

Miután az összeállítás sikeres volt, futtathatjuk a AppServer osztály Java alkalmazásként az IDE-től. Ez elindítja a szervert az adminisztrációs konzollal, és hallgatja a 8080-as portot.

Böngészhetünk //127.0.0.1:8080/api/@/ui és nézze meg az alapvető felhasználói felületet.

A következővel kezdődő útvonalak: /@/ a rendszergazdai konzolhoz használják, amely a RESTX-ben lefoglalt útvonal.

Az adminisztrációs konzolba történő bejelentkezéshez használhatjuk az alapértelmezett „admin és az alkalmazás létrehozása során megadott jelszót.

Mielőtt a konzollal játszanánk, fedezzük fel a kódot, és értsük meg, mit generált a varázsló.

6. A RESTX erőforrás

Az útvonalakat a <main_package> .rest.HelloResource osztály:

@Component @RestxResource public class HelloResource {@GET ("/ message") @RolesAllowed (Roles.HELLO_ROLE) public Message sayHello () {return new Message (). SetMessage (String.format ("hello% s, ez% s") , RestxSession.current (). GetPrincipal (). Get (). GetName (), DateTime.now (). ToString ("HH: mm: ss"))); }}

Rögtön nyilvánvaló, hogy a RESTX az alapértelmezett J2EE kommentárokat használja a biztonsághoz és a REST összerendelésekhez. A függőség-injektáláshoz javarészt saját annotációit használja.

A RESTX sok ésszerű alapértelmezést is támogat a metódus paramétereinek leképezéséhez.

És ezen standard feljegyzések mellett @RestxResource, amely a RESTX által felismert erőforrásként deklarálja.

Az alapút hozzáadódik a src / main / webapp / WEB-INF / web.xml. Esetünkben az / api, így elküldhetünk egy GET kérést a következő címre: // localhost: 8080 / api / message, feltételezve a megfelelő hitelesítést.

A Üzenet class csak egy Java bab, amelyet a RESTX JSON-ba sorosít.

A felhasználói hozzáférést a Szerepek engedélyezve annotáció a HELLO_ROLE amelyet a bootstrapper generált.

7. A modul osztály

Amint azt korábban megjegyeztük, a RESTX a J2EE szabványú függőség-injektálási jelöléseket használja @Nevezett, és feltalálja a sajátját, ahol szükséges, valószínűleg a Dagger keretrendszerhez veszi a célt @ Modul és @ Biztosítja.

Ezekkel hozza létre az alkalmazások fő modulját, amely többek között meghatározza az adminisztrátor jelszavát:

@Module public class AppModule {@Provides public SignatureKey signatureKey () {return new SignatureKey ("restx-demo -44749418370 restx-demo 801f-4116-48f2-906b" .getBytes (Charsets.UTF_8)); } @Provides @Named ("restx.admin.password") public String restxAdminPassword () {return "1234"; } @ Nyilvános ConfigSupplier alkalmazást biztosítConfigSupplier (ConfigLoader configLoader) {return configLoader.fromResource ("restx / demo / settings"); } // egyéb szolgáltatói módszerek az összetevők létrehozásához}

@ Modul meghatároz egy osztályt, amely meghatározhat más, a @ Modul a Tőrben, vagy @ Konfiguráció tavasszal.

@ Biztosítja programozottan tesz ki egy komponenst, mint a @ Biztosítja a Tőrben, vagy @Bab tavasszal.

És végül a @Nevezett annotációval jelzik a gyártott alkatrész nevét.

AppModule biztosítja a SignatureKey az ügyfeleknek küldött tartalom aláírására szolgál. A munkamenet létrehozása során a példaalkalmazáshoz például beállít egy cookie-t, amelyet a konfigurált kulccsal írnak alá:

HTTP / 1.1 200 OK ... Set-Cookie: RestxSessionSignature-restx-demo = "ySfv8FejvizMMvruGlK3K2hwdb8 ="; RestxSession-restx-demo = "..." ...

További információkért tekintse meg a RESTX alkatrészgyárának / függőségi befecskendezési dokumentációját.

8. A Launcher osztály

És végül: AppServer osztály az alkalmazás futtatására szokásos Java alkalmazásként egy beágyazott Jetty kiszolgálón:

public class AppServer {public static final String WEB_INF_LOCATION = "src / main / webapp / WEB-INF / web.xml"; public static final String WEB_APP_LOCATION = "src / main / webapp"; public static void main (String [] args) dobja a (z) {int port = Integer.valueOf (Opcionális.fromNullable (System.getenv ("PORT"))). vagy ("8080") kivételt; WebServer szerver = új Jetty8WebServer (WEB_INF_LOCATION, WEB_APP_LOCATION, port, "0.0.0.0"); System.setProperty ("restx.mode", System.getProperty ("restx.mode", "dev")); System.setProperty ("restx.app.package", "restx.demo"); server.startAndAwait (); }}

Itt a dev módot a fejlesztési szakaszban használják olyan funkciók engedélyezésére, mint az automatikus fordítás, amely lerövidíti a fejlesztési visszacsatolási ciklust.

Csomagolhatjuk az alkalmazást a-ként háború (webarchívum) fájl önálló J2EE webtárolóba telepítésre.

A következő szakaszban megtudhatjuk, hogyan kell tesztelni az alkalmazást.

9. Integráció tesztelése specifikációk segítségével

A RESTX egyik erős tulajdonsága a "specifikációk" fogalma. Egy minta spec így nézne ki:

cím: az adminnak köszönni kell: - időpont: 2013-08-28T01: 18: 00.822 + 02: 00 wts: - mikor: | Üdvözlet? Ki = xavier akkor: | {"message": "szia xavier, 01:18:00 van"}

A teszt egy YAML fájl adott-mikor-akkor struktúrájába van írva, amely alapvetően meghatározza, hogy az API hogyan válaszoljon (azután) külön kérésre (mikor) a rendszer aktuális állapotát figyelembe véve (adott).

A HelloResourceSpecTest osztályban src / test / resources elindítja a fenti specifikációkban írt teszteket:

@RunWith (RestxSpecTestsRunner.class) @FindSpecsIn ("specs / hello") public class HelloResourceSpecTest {}

A RestxSpecTestsRunner osztály egy egyedi JUnit futó. Egyedi JUnit-szabályokat tartalmaz:

  • beágyazott szerver beállítása
  • előkészíti a rendszer állapotát (a adott szakasz a specifikációkban)
  • kiadja a megadott kéréseket, és
  • ellenőrizze a várható válaszokat

A @FindSpecsIn az annotáció a specifikációs fájlok elérési útjára mutat, amelyek ellen a teszteket futtatni kell.

A specifikáció segít az integrációs tesztek megírásában, és példákat ad az API dokumentumokba. A specifikációk szintén hasznosak a HTTP kérések kigúnyolásához és a kérelem / válasz párok rögzítéséhez.

10. Manuális tesztelés

Manuálisan is tesztelhetünk HTTP-n keresztül. Először be kell jelentkeznünk, ehhez pedig kivonatoljuk az adminisztrátori jelszót a RESTX konzolban:

hash md5 

És akkor ezt átadhatjuk a / munkamenetek végpont:

curl -b u1 -c u1 -X POST -H "Tartalom-típus: alkalmazás / json" -d '{"fő": {"név": "admin", "passwordHash": "1d528266b85cf052803a57288"}}' // localhost: 8080 / api / session

(Ne feledje, hogy a Windows-felhasználóknak először le kell tölteniük a göndörítést.)

És most, ha a munkamenet részeként használjuk /üzenet kérés:

curl -b u1 "// localhost: 8080 / api / message? who = restx"

Akkor kapunk valami ilyesmit:

{"message": "szia admin, 09:56:51 van"}

11. A Felügyeleti Konzol felfedezése

Az adminisztrációs konzol hasznos forrásokat biztosít az alkalmazás vezérléséhez.

Vessünk egy pillantást a legfontosabb jellemzőkre a böngészéssel //127.0.0.1:8080/admin/@/ui.

11.1. API-dokumentumok

Az API dokumentumok szakasz felsorolja az összes elérhető útvonalat, beleértve az összes lehetőséget:

És kattinthatunk az egyes útvonalakra, és kipróbálhatjuk őket a konzolon:

11.2. Monitoring

A JVM Metrics szakasz mutatja az alkalmazás metrikáit az aktív munkamenetekkel, a memóriahasználattal és a szálak kiíratásával:

Alatt Alkalmazásmérők főleg két kategóriát elemezünk alapértelmezés szerint:

  • ÉPÍT megfelel az alkalmazás komponenseinek példányosításának
  • HTTP megfelel a RESTX által kezelt HTTP kéréseknek

11.3. Statisztika

A RESTX lehetővé teszi a felhasználó számára, hogy névtelen statisztikákat gyűjtsön és osszon meg az alkalmazásról, hogy információkat nyújtson a RESTX közösségnek. Könnyen leiratkozhatunk a restx-stats-admin modul.

A statisztikák olyan dolgokról számolnak be, mint az alapul szolgáló operációs rendszer és a JVM verzió:

Mivel ez az oldal érzékeny információkat mutat,ellenőrizze a konfigurációs lehetőségeket.

Ezeken kívül az adminisztrációs konzol is segítségünkre lehet:

  • ellenőrizze a szerver naplóit (Naplók)
  • a felmerült hibák megtekintése (hibák)
  • ellenőrizze a környezeti változókat (Config)

12. Engedélyezés

A RESTX végpontok alapértelmezés szerint vannak biztonságban. Ez azt jelenti, hogy bármely végpont esetében:

@GET ("/ greetings / {who}") public Message sayHello (String who) {return new Message (who); }

Ha hitelesítés nélkül hívják, a 401 alapértelmezés szerint.

A végpont nyilvánosságra hozatalához a @PermitAll kommentár akár módszer, akár osztály szintjén:

@PermitAll @GET ("/ greetings / {who}") public Message sayHello (String who) {return new Message (who); }

Ne feledje, hogy osztályszinten minden módszer nyilvános.

Ezenkívül a keretrendszer lehetővé teszi a felhasználói szerepkörök megadását is a @RolesAllowed kommentár:

@RolesAllowed ("admin") @GET ("/ greetings / {who}") public Message sayHello (String who) {return new Message (who); }

Ezzel a feljegyzéssel a RESTX ellenőrzi, hogy a hitelesített felhasználó rendelkezik-e adminisztrátori szerepkörrel is. Abban az esetben, ha egy adminisztrátori szerepkörök nélküli hitelesített felhasználó megpróbálja elérni a végpontot, az alkalmazás a 403 a helyett 401.

Alapértelmezés szerint a felhasználói szerepkörök és a hitelesítő adatok a fájlrendszerben, külön fájlokban vannak tárolva.

Tehát a titkosított jelszóval rendelkező felhasználói azonosító a (z) alatt található /data/credentials.json fájl:

{"user1": "$ 2a $ 10 $ iZluUbCseDOvKnoe", "user2": "$ 2a $ 10 $ oym3Swr7pScdiCXu"}

A felhasználói szerepkörök pedig a következőkben vannak meghatározva /data/users.json fájl:

[{"név": "felhasználó1", "szerepkörök": ["szia"]}, {"név": "felhasználó2", "szerepkörök": []}]

A minta alkalmazásban a fájlok betöltődnek a AppModule a FileBasedUserRepository osztály:

új FileBasedUserRepository (StdUser.class, leképező, új StdUser ("admin", ImmutableSet. ("*")), Paths.get ("data / users.json"), Paths.get ("data / credentials.json" ), igaz)

A StdUser osztály tartalmazza a felhasználói objektumokat. Lehet egyedi felhasználói osztály, de sorosíthatónak kell lennie a JSON-ban.

Természetesen használhatunk mást is UserRepository megvalósítás, mint például egy adatbázis elérése.

13. Következtetés

Ez az oktatóanyag áttekintést adott a könnyű Java-alapú RESTX keretrendszerről.

A keretrendszer még fejlesztés alatt áll, és előfordulhat, hogy néhány durva él használja. További részletekért tekintse meg a hivatalos dokumentációt.

A bootstrapped minta a GitHub-tárunkban érhető el.