Smerovanie v aplikáciách Play v prostredí Java

1. Prehľad

Smerovanie je bežný koncept, ktorý sa objavuje vo väčšine rámcov pre vývoj webových aplikácií vrátane Spring MVC.

Trasa je vzor adresy URL, ktorý je mapovaný na obslužnú rutinu. Obslužnou rutinou môže byť fyzický súbor, napríklad stiahnuteľný prostriedok vo webovej aplikácii alebo trieda, ktorá spracuje požiadavku, napríklad radič v aplikácii MVC.

V tomto tutoriáli preskúmame aspekt smerovania pri vývoji webových aplikácií pomocou rámca Play.

2. Inštalácia

Najskôr si budeme musieť vytvoriť aplikáciu Java Play. Podrobnosti o tom, ako nastaviť Play Framework na počítači, nájdete v našom úvodnom článku.

Na konci nastavenia by sme mali mať funkčnú aplikáciu Play, ku ktorej budeme mať prístup z prehliadača.

3. Smerovanie HTTP

Ako teda Play vie, s ktorým radičom sa treba poradiť, kedykoľvek pošleme žiadosť HTTP? Odpoveď na túto otázku spočíva v app / conf / trasy konfiguračný súbor.

Router Play prevádza požiadavky HTTP na volania akcií. HTTP požiadavky sa v architektúre MVC považujú za udalosti a smerovač na ne reaguje konzultáciou s trás súbor, pre ktorý kontrolór a ktorú činnosť v tomto kontrolóri vykonať.

Každá z týchto udalostí dodáva smerovaču dva parametre: cestu požiadavky s reťazcom dopytu a metódu HTTP požiadavky.

4. Základné smerovanie pomocou služby Play

Aby mohol router vykonávať svoju prácu, conf / trasy súbor musí definovať mapovanie metód HTTP a vzorov URI na príslušné akcie radiča:

GET / controllers.HomeController.index GET / assets / * file controllers.Assets.versioned (path = "/ public", súbor: aktívum)

Všetky súbory trás musia tiež mapovať statické prostriedky v priečinku play-routing / verejné priečinok, ktorý má klient k dispozícii na serveri /aktíva koncový bod.

Všimnite si syntax definovania smerov HTTP a metódu HTTP priestor Vzor URI priestor činnosť kontrolóra.

5. Vzory URI

V tejto časti sa trochu zameriame na vzory URI.

5.1. Statické vzory URI

Prvé tri vyššie uvedené vzory URI sú statické. To znamená, že k mapovaniu adries URL na zdroje dochádza bez ďalšieho spracovania v akciách radiča.

Pokiaľ sa volá metóda radiča, vráti statický prostriedok, ktorého obsah je určený pred požiadavkou.

5.2. Dynamické vzory URI

Posledný vyššie uvedený vzor URI je dynamický. To znamená, že činnosť radiča obsluhujúca požiadavku na týchto identifikátoroch URI potrebuje na určenie odpovede určité informácie zo žiadosti. Vo vyššie uvedenom prípade očakáva názov súboru.

Bežná postupnosť udalostí je taká, že smerovač prijme udalosť, vyberie cestu z adresy URL, dekóduje jej segmenty a odovzdá ich kontroléru.

Parametre cesty a dopytu sa potom vložia do akcie radiča ako parametre. Toto si ukážeme na príklade v ďalších častiach.

6. Pokročilé smerovanie pomocou služby Play

V tejto časti podrobne rozoberieme pokročilé možnosti smerovania pomocou dynamických vzorov URI.

6.1. Jednoduché parametre cesty

Parametre jednoduchej cesty sú nepomenované parametre v adrese URL požiadavky, ktoré sa zobrazujú za hostiteľom a portom a sú analyzované v poradí, v akom sa nachádzajú.

Vo vnútri play-routing / app / HomeController.java, vytvorme novú akciu:

public Výsledok pozdrav (Názov reťazca) {return ok ("Hello" + meno); }

Chceme mať možnosť vybrať parameter cesty z adresy URL žiadosti a namapovať ju na názov premennej.

Smerovač získa tieto hodnoty z konfigurácie trasy.

Poďme teda otvoriť play-routing / conf / trasy a vytvorte mapovanie pre túto novú akciu:

GET / greet /: name controllers.HomeController.greet (name: String)

Všimnite si, ako informujeme smerovač, že názov je segment dynamickej cesty so syntaxou dvojbodky, a potom ho odovzdajte ako parameter volaniu akcie pozdraviť.

Teraz načítajme // locahost: 9000 / greet / john v prehliadači a privíta nás meno:

Ahoj john

Stáva sa to tak ak je náš parameter akcie reťazcového typu, môžeme ho odovzdať počas hovoru bez uvedenia typu parametra, aj keď to pre iné typy nie je rovnaké.

Poďme okoreniť svoje / pozdravujem koncový bod s informáciami o veku.

Späť k HomeControllerZdravím, zmeníme to na:

public Výsledok pozdrav (String name, int age) {return ok ("Hello" + name + ", you are" + age + "years old"); }

A trasa do:

GET / greet /: name /: age controllers.HomeController.greet (name: String, age: Integer)

Všimnite si tiež syntax Scaly na deklarovanie premennej, vek: Celé číslo. V Jave by sme použili Celé číslo syntax. Play Framework je zabudovaný do Scaly. V dôsledku toho existuje veľa syntaxe scala.

Naložíme // localhost: 9000 / greet / john / 26:

Ahoj john, máš 26 rokov

6.2. Zástupné znaky v parametroch cesty

V našom konfiguračnom súbore trás je posledné mapovanie:

GET / assets / * file controllers.Assets.versioned (path = "/ public", súbor: aktívum)

V dynamickej časti cesty používame zástupný znak. Hovoríme Play, že akákoľvek hodnota nahradí * súbor v skutočnej žiadosti by mal byť analyzovaný ako celok a nie dekódovaný ako v iných prípadoch parametrov cesty.

V tomto príklade je radič zabudovaný, Aktíva, ktorá umožňuje klientovi sťahovať súbory z play-routing / verejné priečinok. Keď naložíme //localhost:9000/assets/images/favicon.png, mali by sme v prehliadači vidieť obraz favikonu Play, pretože je prítomný v priečinku / public / images priečinok.

Vytvorme si vlastnú ukážkovú akciu v HomeController.java:

verejny vysledok introduMe (String data) {String [] clientData = data.split (","); návrat ok („Vaše meno je„ + clientData [0] + “, ste„ + clientData [1] + „rokov“); }

Všimnite si, že v tejto akcii dostaneme jeden parameter String a použijeme našu logiku na jeho dekódovanie. V takom prípade je logické rozdelenie oddelené čiarkou String do poľa. Predtým sme záviseli od smerovača, ktorý nám tieto údaje dekódoval.

Vďaka zástupným znakom sme na to sami. Dúfame, že klient pri odovzdávaní týchto údajov dostane správnu našu syntax. V ideálnom prípade pred použitím by sme mali overiť prichádzajúci reťazec.

Vytvorme cestu k tejto akcii:

Kontroléry údajov GET / *. HomeController.introduceMe (údaje)

Teraz načítajte adresu URL // localhost: 9000 / john, 26. Týmto sa vytlačí:

Vaše meno je john, máte 26 rokov

6.3. Regulárny výraz v parametroch cesty

Rovnako ako zástupné znaky, aj pre dynamickú časť môžeme použiť regulárne výrazy. Pridajme akciu, ktorá prijme číslo a vráti svoj štvorec:

public Výsledok squareMe (Long num) {return ok (num + "Squared is" + (num * num)); }

Teraz pridáme jeho trasu:

Ovládače GET / square / $ num.HomeController.squareMe (počet: dlhé)

Umiestnime túto trasu pod predstav ma cestou zavedenia nového konceptu. S touto konfiguráciou smerovania môžeme manipulovať iba s cestami, kde je časť regulárneho výrazu kladné celé číslo.

Teraz, ak sme umiestnili trasu podľa pokynov v predchádzajúcom odseku, a načítame // localhost: 9000 / štvorec / 2, mali by sme byť pozdravení s ArrayIndexOutOfBoundsException:

Ak skontrolujeme chybové protokoly v konzole servera, uvedomíme si, že volanie akcie bolo skutočne vykonané dňa predstav ma skôr akcia ako squareMe akcia. Ako už bolo povedané o zástupných znakoch, sme na to sami a prichádzajúce údaje sme neoverili.

Namiesto reťazca oddeleného čiarkou sa používa znak predstav ma metóda bola volaná s reťazcom „štvorec / 2„. Následne sme po jeho rozdelení dostali pole o veľkosti jedna. Pokúšam sa dosiahnuť index 1 potom hodil výnimku.

Prirodzene by sme očakávali, že hovor bude smerovaný na squareMe metóda. Prečo to bolo smerované na predstav ma? Dôvodom je funkcia Play, ktorej sa budeme venovať ďalej Priorita smerovania.

7. Priorita smerovania

Ak dôjde ku konfliktu medzi trasami ako medzi nimi squareMe a predstav mapotom Play vyberie prvú trasu v deklaračnom poradí.

Prečo dochádza ku konfliktu? Kvôli zástupnej ceste kontextu / * údaje sa zhoduje s akoukoľvek požiadavkou URL okrem základnej cesty /. Takže každá trasa, ktorej vzor URI používa zástupné znaky, by sa mala zobraziť posledná v poradí.

Teraz poďme zmeniť poradie vyhlásenia trás tak, aby: predstav ma trasa nasleduje squareMe a znova načítať:

2 na druhú je 4

Ak chcete vyskúšať silu regulárnych výrazov na trase, skúste načítať // locahost: 9000 / štvorec / -1, smerovač sa nebude zhodovať s squareMe trasa. Namiesto toho sa to bude zhodovať predstav ma, a dostaneme ArrayIndexOutOfBoundsException ešte raz.

To je preto, že -1 nezodpovedá poskytnutému regulárnemu výrazu, nezhoduje sa ani žiadny abecedný znak.

8. Parametre

Až do tohto bodu sme pokryli syntax pre deklarovanie typov parametrov v súbore Route.

V tejto časti sa pozrieme na ďalšie možnosti, ktoré máme k dispozícii pri práci s parametrami v trasách.

8.1. Parametre s pevnými hodnotami

Niekedy budeme chcieť pre parameter použiť pevnú hodnotu. Toto je náš spôsob, ako povedať službe Play, aby použila poskytnutý parameter cesty alebo či je kontext žiadosti cesta /, potom použite určitú pevnú hodnotu.

Ďalším spôsobom, ako sa na to pozerať, je mať dva koncové body alebo kontextové cesty vedúce k rovnakej akcii radiča - pričom jeden koncový bod vyžaduje parameter z adresy URL žiadosti a predvolený je druhý v prípade, že uvedený parameter chýba.

Aby sme to demonštrovali, pridajme a spisovateľ () akcia na HomeController:

public Result writer () {return ok ("Routing in Play by Baeldung"); }

Za predpokladu, že nie vždy chceme, aby naše API vrátilo a String:

Smerovanie v hre pomocou Baeldungu

Chceme to ovládať zasielaním mena autora článku spolu s požiadavkou, predvolenou hodnotou je pevná hodnota Baeldung iba ak žiadosť nemá autor parameter.

Poďme teda ďalej zmeniť spisovateľka akcia pridaním parametra:

public Result writer (String autor) {return ok ("REST API with Play by" + autor); }

Pozrime sa tiež, ako pridať parameter pevnej hodnoty do trasy:

GET / spisovateľ controllers.HomeController.writer (autor = "Baeldung") GET / spisovateľ /: autor controllers.HomeController.writer (autor: reťazec)

Všimnite si, ako teraz máme dve samostatné trasy vedúce k HomeController.index akcia namiesto jednej.

Keď teraz naložíme // localhost: 9000 / spisovateľ z prehliadača dostaneme:

Smerovanie v hre pomocou Baeldungu

A keď naložíme // localhost: 9000 / writer / john, dostaneme:

Smerovanie v hre od Jána

8.2. Parametre s predvolenými hodnotami

Okrem pevných hodnôt môžu mať parametre aj predvolené hodnoty. Obe poskytujú záložné hodnoty akčným parametrom radiča v prípade, že požiadavka neposkytuje požadované hodnoty.

Rozdiel medzi nimi je v tom pevné hodnoty sa používajú ako náhrada pre parametre cesty, zatiaľ čo predvolené hodnoty sa používajú ako náhrada pre parametre dotazu.

Parametre cesty majú tvar // localhost: 9000 / param1 / param2 a parametre dotazu sú vo forme // localhost: 9000 /? param1 = hodnota1¶m2 = hodnota2.

Druhý rozdiel je v syntaxi deklarovania dvoch v trase. Parametre pevnej hodnoty používajú operátor priradenia ako v:

autor = "Baeldung"

Zatiaľ čo predvolené hodnoty používajú iný typ priradenia:

autor? = "Baeldung"

Používame ?= operátor, ktorý podmienečne priraďuje Baeldung do autor v prípade autor neobsahuje žiadnu hodnotu.

Ak chcete mať kompletnú ukážku, vytvorme HomeController.writer akcia. Povedzme, že okrem mena autora, ktoré je parametrom cesty, chceme tiež odovzdať autora id ako parameter dopytu, ktorý by mal mať predvolene hodnotu 1 ak nie je odovzdaný v žiadosti.

Zmeníme sa spisovateľka akcia na:

public Result writer (String author, int id) {return ok ("Routing in Play by:" + author + "ID:" + id); }

a spisovateľka trasy do:

GET / writer controllers.HomeController.writer (autor = "Baeldung", id: Int? = 1) GET / writer /: autor controllers.HomeController.writer (autor: String, id: Int? = 1)

Načítava sa // localhost: 9000 / spisovateľ vidíme:

Smerovanie v hre: Baeldung ID: 1

Biť // localhost: 9000 / writer? id = 10 dáva nám:

Smerovanie v hre: Baeldung ID: 10

Čo takto // localhost: 9000 / writer / john?

Smerovanie v hre vytvoril: john ID: 1

A nakoniec, // localhost: 9000 / writer / john? id = 5 vracia:

Smerovanie v hre: John ID: 5

9. Záver

V tomto článku sme sa zaoberali pojmom smerovanie v aplikáciách Play. Máme tiež článok o zostavení rozhrania RESTful API s Play Framework, kde sú koncepty smerovania v tomto tutoriále použité v praktickom príklade.

Ako obvykle je zdrojový kód tohto tutoriálu k dispozícii na GitHub.


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