Programavimas

„REST“ „Java“ kūrėjams, 2 dalis

Atvirojo kodo „Restlet“ API sumažina „Java“ RESTful API kūrimo ir vartojimo darbo krūvį. Šiame antrame straipsnyje „REST“ „Java“ kūrėjams serijoje Brianas Slettenas supažindina jus su „Restlet“ ir apžvelgia programos pavyzdį, diegdamas jo sąsajas į šiandien naudojamus servletų konteinerius, kartu pasiruošdamas ateities sistemoms. Brianas taip pat trumpai pristato JSR 311: JAX-RS, „Sun“ pastangas integruoti RESTful API su „Java EE“ kaminu.

„Java“ kūrėjai jau seniai domisi REST architektūros stiliumi, tačiau nedaugelis dar nuvažiavo atstumą tarp pažįstamo objektų pasaulio ir RESTful išteklių pasaulio. Nors mums gali patikti tai, kad RESTful paslaugas gali gaminti ar vartoti kitos kalbos, mes nekenčiame duomenų konvertavimo į baitų srautus ir iš jų. Mes nekenčiame galvoti apie HTTP, kai naudojate tokius įrankius kaip „Apache HTTP Client“. Mes ilgesingai žiūrime į objektus, sukurtus wsdl2java komanda, kuri leidžia mums perkelti argumentus į SOAP paslaugą taip pat lengvai, kaip ir bet kurį kitą metodo skambutį, po kilimu nušlifuojantys nuotolinės paslaugos iškvietimo detales. Ir manome, kad servleto modelis yra šiek tiek per daug atsietas nuo gaminamų išteklių. Pakanka pasakyti, kad mes buvome sugeba kurti pailsėjusias paslaugas nuo nulio, tai nebuvo maloni patirtis.

„REST“ „Java“ kūrėjams

Perskaitykite seriją:

  • 1 dalis: kalba eina apie informaciją
  • 2 dalis: Atpalaiduojantis pavargusiems žmonėms
  • 3 dalis: „NetKernel“

Politinės problemos kartais apsunkino technines kliūtis. Daugelis vadovų mano, kad SOAP pagrįstos žiniatinklio paslaugos yra nustatytas būdas kurti „Java EE“ į paslaugas orientuotas architektūras (SOA). Tai keičiasi atsirandant svarbioms veikloms, tokioms kaip JSR 311, JAX-RS: „Java“ API „RESTful Web Services“, apie kurią sužinosite šiame straipsnyje. Jei nieko daugiau, šios pastangos įteisina RESTful plėtrą JEE erdvėje.

Tuo tarpu pagalba atėjo. Elegantiškai, atvirojo kodo „Restlet“ sistema leidžia lengvai išvengti nemalonių problemų, kurios gali kilti naudojant tradicinę JEE technologiją kuriant ir vartojant „RESTful“ paslaugas.

Restleto šaknys

Siekdamas išspręsti kai kurias technines problemas, susijusias su „REST“ vykdymu su „Java“, prancūzų programinės įrangos konsultantas Jérome'as Louvelas siekė sukurti sistemą, kuri būtų natūralesnė. Jis pirmiausia pažvelgė į „NetKernel“ aplinką kaip atspirties tašką. Kad ir kaip jis jam patiko, jis nebuvo visiškai tinkamas API orientuotai sistemai, kurią jis siekė padaryti prieinamą. Patirtis padėjo paveikti jo mąstymą apie tai, kokius dalykus gali pasiūlyti į poilsį orientuota aplinka. (Kitame šios serijos straipsnyje bus išsamiau išnagrinėta „NetKernel“.)

Kai Louvel dirbo prie jo sistemos, jis sukūrė tris tikslus:

  • Paprasti veiksmai turėtų būti paprasti pagrindiniam naudojimui. Numatytieji parametrai turėtų veikti su minimaliomis pastangomis, bet taip pat leisti atlikti sudėtingesnes konfigūracijas.
  • Šiai API parašytas kodas turėtų būti nešiojamas visuose konteineriuose. Nors servletais pagrįstas sistemas galima perkelti tarp tokių konteinerių kaip „Tomcat“, „Jetty“ ir „IBM WebSphere“, „Louvel“ turėjo omenyje didesnį vaizdą. „Servlet“ specifikacija yra susieta su HTTP ir blokuojančiu įvesties / išvesties modeliu. Jis norėjo, kad jo API būtų atskirta nuo abiejų ir būtų dislokuojama į šiandien naudojamus konteinerius. Jis taip pat norėjo, kad jie būtų naudojami be didelių pastangų alternatyviuose ir atsirandančiuose konteineriuose, tokiuose kaip „Grizzly“, „AsyncWeb“ ir „Simple Framework“.
  • Tai turėtų praturtinti ne tik serverio pusę kuriant „RESTful“ sąsajas „Java“, bet ir kliento pusę. „HttpURLConnection“ klasė ir „Apache“ HTTP klientas yra per žemo lygio, kad būtų galima švariai integruotis tiesiai į daugumą programų.

Turėdamas omenyje šiuos tikslus, jis nusprendė gaminti „Restlet“ API. Po kelerių metų srauto API tapo stabili ir aplink ją išaugo bendruomenė. Šiandien pagrindinė API turi gyvybingą vartotojų bazę ir vyksta didelė veikla, palaikanti integraciją su kitais įrankių rinkiniais ir iniciatyvomis, tokiomis kaip JAX-RS. (Louvel dabar yra JAX-RS ekspertų grupėje.)

„Restlet“ pagrindai

Pagrindinis serveris su „Restlet API“ negali būti lengvesnis, kaip parodyta 1 sąraše.

Sąrašas 1. Pagrindinis serveris su „Restlet“

paketas net.bosatsu.restlet.basic; importuoti org.restlet.Restlet; importuoti org.restlet.Server; importuoti org.restlet.data.MediaType; importuoti org.restlet.data.Protocol; importuoti org.restlet.data.Request; importuoti org.restlet.data.Response; public class „SimpleServer“ {public static void main (String [] args) meta išimtį {Restlet restlet = new Restlet () {@Override public void hand (Request request, Response response) {response.setEntity ("Sveiki, Java RESTafarianai!", MediaType.TEXT_PLAIN); }}; // Venkite konfliktų su kitais „Java“ konteineriais, klausydamiesi 8080! naujas serveris (protokolas.HTTP, 8182, restletas) .start (); }}

Ši programa nedaug ką daro (išskyrus skleidžiamą gerą nuotaiką), tačiau ji parodo du pagrindinius „Restlet“ principus. Pirma, paprasti dalykai yra paprasti. Sudėtingesnė veikla tikrai įmanoma, tačiau dėl jos nerimaujate tik tada, kai to reikia. „REST“ netrūksta galimybės užtikrinti saugumą, apribojimus, derybas dėl turinio ar kitų svarbių užduočių. Tai iš esmės lieka ortogonalios veiklos, visiškai skirtingos nuo RESTful API patenkinimo proceso. Sudėkite sudėtingumą, jei reikia.

Antra, 1 sąrašo kodas sukurtas taip, kad būtų nešiojamas tarp konteinerių tipų. Atkreipkite dėmesį, kad jame nenurodomas sudėtinis rodinys. „Restlet“Tai yra tikrieji ištekliai, galiausiai atsakantys į užklausas. Nėra skirtumo tarp užklausą tvarkančio konteinerio ir informacinių išteklių atsakiklio, nes tai gali būti servletų modelyje. Jei įvesite kodą į IDE ir pridėsite priklausomybes nuo org.restlet.jar ir com.noelios.restlet.jar archyvus, galite paleisti programą ir turėtumėte pamatyti tokį žurnalo pranešimą:

2008 m. Gruodžio 7 d. 23:37:32 com.noelios.restlet.http.StreamServerHelper start INFO: Vidinio HTTP serverio paleidimas

Nukreipkite naršyklę // vietinis šeimininkas: 8182ir turėtumėte pamatyti draugišką sveikinimą.

Užkulisiuose org.restlet.jar yra visos pagrindinės šios API sąsajos. com.noelios.restlet.jar yra pagrindinis šių sąsajų įgyvendinimas ir numatytoji HTTP valdymo galimybė. Nenorėsite pradėti gaminti naudodami šį HTTP variklį, tačiau jis yra ypač patogus kūrimo ir bandymo tikslais. Norėdami išbandyti „RESTful“ kodą, nereikia paleisti pagrindinio konteinerio. Dėl to vieneto ir integracijos testavimas gali būti daug lengvesnis.

1 sąrašo pavyzdys naudoja daug numatytųjų veiksmų, kad sukurtumėte numatytąjį Taikymas instancija (aptarsiu Taikymas kitame pavyzdyje) ir išklausykite HTTP protokolo užklausų 8182 prievade „StreamServerHelper“ klasė pradeda klausytis šiame uoste ir siunčia užklausas „Restlet“ pavyzdžiui, kai jie ateina.

„Louvel“ tikslas palaikyti kliento „RESTful Java“ taip pat lengvai pasiekiamas, kaip matote 2 sąraše.

Sąrašas 2. „Restlet“ klientas

paketas net.bosatsu.restlet.basic; importuoti java.io.IOException; importuoti org.restlet.Client; importuoti org.restlet.data.Protocol; public class SimpleClient {public static void main (String [] args) meta IOException {String uri = (args.length> 0)? args [0]: "// vietinis savininkas: 8182"; Kliento klientas = naujas klientas (protokolas.HTTP); client.get (uri) .getEntity (). write (System.out); }}

Su „SimpleServer“ vis dar veikia, paleisdami šį naują kliento kodą su tomis pačiomis JAR priklausomybėmis, turėtumėte atsispausdinti draugišką sveikinimą konsolėje. Išvesties spausdinimas šiuo stiliumi akivaizdžiai neveikia į dvejetainius orientuotus MIME tipus, tačiau, vėlgi, tai yra patogus atspirties taškas.

Ne CRUD pavyzdys

Dauguma pedagoginių REST pavyzdžių rodo paprastų objektų CRUDish paslaugas (Kurti, Gauti, Atnaujinti, Ištrinti). Nors šis stilius tikrai gerai veikia su „REST“, tai jokiu būdu nėra vienintelis prasmingas požiūris - ir šiaip ar taip, dauguma iš mūsų yra pavargę nuo „CRUD“ pavyzdžių. Šiame pavyzdyje parodomi „Restlet“ programos pagrindai, apvyniojant atvirojo kodo „Jazzy“ rašybos tikrintuvą.

„REST“ yra informacijos tvarkymas, o ne savavališko elgesio iškvietimas, todėl turite būti atsargūs, kai svarstote į elgesį orientuotą API, pvz., „Jazzy“. Apgaulė yra traktuoti RESTful API kaip informacinę erdvę žodžiams, kurie egzistuoja ir neegzistuoja naudojamuose žodynuose. Problemą būtų galima išspręsti įvairiais būdais, tačiau šiame straipsnyje bus apibrėžtos dvi informacinės erdvės. / žodynas yra naudojamas žodžiuose valdyti žodžius. / rašybos tikrintuvas yra naudojamas ieškant žodžių, panašių į neteisingai parašytus žodžius, pasiūlymų. Abu jie sutelkia dėmesį į informaciją atsižvelgdami į žodžių nebuvimą ar buvimą informacinėse erdvėse.

RESTful architektūroje ši HTTP komanda gali pateikti žodžio apibrėžimą žodyne:

GET // localhost: 8182 / žodynas /žodis

Tikriausiai jis grąžins HTTP atsakymo kodą „Nerasta“ žodžiams, kurių nėra žodyne. Šioje informacinėje erdvėje gerai nurodyti, kad žodžių nėra. Jazzy nepateikia žodžių apibrėžimų, todėl skaitytojui paliksiu grąžinti tam tikrą turinį.

Ši kita HTTP komanda turėtų pridėti žodį į žodyną:

PUT // localhost: 8182 / žodynas /žodis

Šis pavyzdys naudoja ĮDĖK nes galite išsiaiškinti, koks URI yra / žodynas informacinė erdvė turėtų būti iš anksto ir išduodanti kelis ĮDĖKs neturėtų daryti skirtumo. (ĮDĖK yra idempotentinis prašymas GAUTI. Išduodant tą pačią komandą kelis kartus, neturėtų būti jokio skirtumo.) Jei norite pridėti apibrėžimus, galite juos perduoti kaip kūnus ĮDĖK vedlys. Jei laikui bėgant norite priimti kelis apibrėžimus, galbūt norėsite POST tuos apibrėžimus, nes ĮDĖK yra perrašymo operacija.

Nepamirškite sinchronizavimo

Siekiant išlaikyti sutelktus pavyzdžius, šiame straipsnyje ypatingas dėmesys neskiriamas sinchronizavimo problemoms spręsti. Negalima taip negailėti savo gamybos kodo! Pasikonsultuokite su tokiais šaltiniais kaip „Java“ lygiagretumas praktikoje Daugiau informacijos.

„Restlet“ mano sukurti atvejai turi būti susieti su atitinkamomis informacinėmis erdvėmis, kaip parodyta 3 sąraše.

Sąrašas 3. Paprastas RESTful rašybos tikrintuvas

paketas net.bosatsu.restlet.spell; importuoti com.swabunga.spell.event.SpellChecker; importuoti com.swabunga.spell.engine.GenericSpellDictionary; importuoti com.swabunga.spell.engine.SpellDictionary; importuoti java.io.File; importuoti java.io.FileNotFoundException; importuoti java.io.IOException; importuoti org.restlet.data.Protocol; importuoti org.restlet. *; public class SpellCheckingServer praplečia taikomąją programą {public static String dictionary = "Restlet / dict / english.0"; viešasis statinis „SpellDictionary“ spellingDict; viešasis statinis „SpellChecker“ „spellChecker“; viešasis statinis „Restlet“ „spellCheckerRestlet“; viešasis statinis „Restlet“ žodynas „Restlet“; statinis {pabandykite {spellingDict = naujas GenericSpellDictionary (naujas failas (žodynas)); spellChecker = new SpellChecker (spellingDict); spellCheckerRestlet = naujas SpellCheckerRestlet (spellChecker); dictionaryRestlet = naujas DictionaryRestlet („spellChecker“); } gaudyti (e išimtis) {e.printStackTrace (); }} public static void main (eilutė [] argumentuoja) išmeta išimtį {Komponento komponentas = naujas komponentas (); komponentas.getServers (). pridėti (protokolas.HTTP, 8182); SpellCheckingServer spellingService = new SpellCheckingServer (); komponentas.getDefaultHost (). attach ("", spellingService); komponentas.pradėti (); } public Restlet createRoot () {Router router = new Router (getContext ()); router.attach ("/ spellchecker / {word}", spellCheckerRestlet); router.attach ("/ dictionary / {word}", dictionaryRestlet); grąžinti maršrutizatorių; }}

Sukūrus žodyno egzempliorių ir rašybos tikrintuvą, „Restlet“ sąranka 3 sąraše yra šiek tiek sudėtingesnė nei ankstesniame pagrindiniame pavyzdyje (bet nedaug!). „SpellCheckingServer“ yra „Restlet“ pavyzdys Taikymas. An Taikymas yra organizacinė klasė, kuri koordinuoja funkciškai sujungtų sistemų diegimą „Restlet“ atvejų. Aplinkiniai Komponentas klausia an Taikymas dėl savo šaknies „Restlet“ paskambinę createRoot () metodas. Šaknis „Restlet“ grąžino nurodo, kas turėtų atsakyti į išorinius prašymus. Šiame pavyzdyje klasė vadinama Maršrutizatorius yra naudojamas išsiųsti į pavaldžias informacines erdves. Be šio susiejimo su kontekstu, jis nustato URL šabloną, kuris leidžia „žodžio“ URL dalį kaip užklausos atributą pasiekti. Tai bus panaudota programoje „Restlet“sukurta 4 ir 5 sąrašuose.

DictionaryRestlet, parodytas 4 sąraše, yra atsakingas už užklausų dėl manipuliavimo / žodynas informacinė erdvė.

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