[4] Moderne aplikacije :: Uvod u REST i URL rewrite

[4] Moderne aplikacije :: Uvod u REST i URL rewrite

offline
  • Srđan Tot
  • Am I evil? I am man, yes I am.
  • Pridružio: 12 Jul 2005
  • Poruke: 2483
  • Gde živiš: Ljubljana

MySQL server
Nastaviće se...




Potrebno znanje za praćenje teksta:
Korišćenje sistemskih alata
Osnove RegEx-a
Osnove PHP-a


Sadržaj

[1] Uvod

[2] REST servisi i klijenti

[3] URL rewrite
[3.1] Windows
[3.2] Linux
[3.3] Mac OS X

[4] Korišćenje URL rewrite-a

[5] Jednostavan REST servis




[1] Uvod


Kada smo govorili o modernim aplikacijama, rekli smo da većina podatke čuva negde na internetu. Zbog toga je potrebno na neki način te podatke preneti sa internet servera u aplikaciju. Za prenos podataka se u većini slučajeva koristi TCP protokol koji, između ostalog, omogućava prenos podataka kroz lokalnu mrežu i internet. TCP protokol ima veoma široku primenu i omogućava razmenu bilo kakvih podataka i zbog toga je bitno da server i klijent koriste isti jezik pri komunikaciji. Kada kažem jezik mislim na precizno definisan skup komandi/poruka koje server i klijent moraju da podrže. Jedan od takvih jezika je HTTP, koji se koristi za komunikaciju internet servera i pretraživača. HTTP protokol je savršen za komunikaciju jer skoro sve mreže dozvoljavaju prenos HTTP paketa, lak je za korišćenje i daje dovoljnu slobodu za prenos različitih vrsta podataka. Uzevši u obzir i veliki broj biblioteka koje podržavaju HTTP protokol, sasvim je jasno zašto je on jedan od najčešće korišćenih protokola za razmenu informacija preko interneta.



[2] REST servisi i klijenti


REST je jedan od načina prenosa podataka koji koristi HTTP protokol. Lepota REST-a je da ne zahteva komplikovane komande i odgovore, i vrlo često je moguće koristiti REST servise čak i preko pretraživača. Najčešće korišćene HTTP komande su GET, PUT, POST i DELETE. Na osnovu URL-a, komande i parametara, REST servis određuje koju akciju je potrebno izvršiti nad određenim podatkom u bazi.

Ono što je karakteristično za REST servise je da su podaci podeljeni na resurse, odnosno da svaki tip podatka ima svoj URL preko kojeg se vrše akcije nad podacima. Uzmimo za primer jednostavan imenik koji čuva podatke o osobama i njihovim telefonskim brojevima. Ako se odlučimo da osobama pristupamo preko resursa osobe, dovoljno je da otvorimo http://www.primer.com/osobe/ i u pretraživaču bi dobili listu osoba. Kada otvaramo stranice preko pretraživača, komanda koja se šalje na server je GET. To znači da bi REST servis koji se nalazi na http://www.primer.com/ dobio komandu GET za resurs osobe bez parametara, što znači da treba klijentu, odnosno pretraživaču da vrati listu osoba.

Standardne akcije za HTTP komande su:
GET: vraća listu traženih podataka
POST: kreira nov podatak
PUT: menja podatak
DELETE: briše podatak


Ako nastavimo priču sa osobama, komandom GET bi dobili podatke osobe koja ima identifikator (polje u bazi koje je unikatno za svaku osobu) 1 ako bi zatražili URL http://www.primer.com/osobe/1. Ako bismo rekli da svaka osoba može imati više telefonskih brojeva, onda bi do tih telefonskih brojeva dolazili korišćenjem URL-a osobe na koji bi dodali i ime resursa za telefone, recimo ovako: http://www.primer.com/osobe/22/telefoni/. Dakle, kompletan zahtev od klijenta ka serveru ide preko HTTP komandi i parametara.

Kao što smo već rekli, server na svojoj strani analizira URL na osnovu kojeg određuje nad kojim podacima će komanda biti izvršena, i izvršava zadatu komandu. Rezultat koji će biti vraćen klijentu može biti u bilo kom tekstualnom obliku, a najčešće se koriste običan tekst, HTML, XML i JSON. Ukoliko server podržava vraćanje rezultata u više oblika, format uglavnom određuje klijent preko Accept parametra u HTTP zaglavlju. Za prikaz podataka u pretraživaču se koristi običan tekst ili HTML, jer su ti formati ljudima lako čitljivi, dok su XML i JSON odlični za obradu podataka u aplikacijama. Kada server pošalje podatke klijentu, njegov zadatak je da te podatke obradi i pripremi za prikaz korisniku.



[3] URL rewrite


Ranije smo spomenuli da se kod REST servisa do podataka pristupa preko resursa, tj. URL-a koji im je dodeljen. Ako opet uzmemo primer osobe iz imenika, klijent od servera može tražiti podatak http://www.primer.com/osobe/142 što u suštini znači da će internet server potražiti na disku direktorijum osobe, i u njemu direktorijum 142, i pokušati klijentu da vrati sadržaj direktorijuma. Nama taj način ne odgovara jer bi to značilo da bismo morali da pravimo direktorijume za svaki kreirani zapis u bazi i da u njih napravimo datoteku koja će generisati sadržaj za klijenta. Taj problem se rešava korišćenjem malog dodatka za internet server koji se zove URL rewrite. Ono što on zna da uradi je da na osnovu definisanih pravila, obradi URL koji je bio poslan serveru i pripremi nov. Na taj način možemo imati jednu stranicu (npr: index.php) koja kao parametre prima podatke o željenoj akciji, a URL rewriter će URL popraviti u npr: http://www.primer.com/index.php?res="osobe"&id="142". Time smo omogućili klijentu da do podataka dolazi jednostavnim URL-om, dok na serveru nemamo brdo nepotrebnih direktorijume nego samo jednu stranicu koja je zadužena za obradu podataka.

Instalacija ovog dodatka je prilično jednostavna i ne zahteva puno vremena.


[3.1] Windows

Microsoft Internet Information Services
Potrebno je samo preuzeti i instalirati URL Rewrite dodatak:
32-bit: http://go.microsoft.com/?linkid=9722533
64-bit: http://go.microsoft.com/?linkid=9722532



WAMP
WAMP dolazi sa već instaliranim dodatkom rewrite_module i potrebno ga je samo uključiti preko WAMP ikonice:




Apache
Apache takođe dolazi sa već instaliranim dodatkom, a uključuje se tako što ćete otvoriti datoteku C:\Apache24\conf\httpd.conf i odkomentirati (obrisati #) red u kojem piše:
#LoadModule rewrite_module modules/mod_rewrite.so
Nakon toga je potrebno ponovo pokrenuti Apache servis kucanjem sledeće komande u Command Prompt-u pokrenutim pod administratorskim nalogom:
C:\Apache24\bin\httpd –k restart


[3.2] Linux

Uključivanje dodatka se vrši pokretanjem komande:
sudo a2enmod rewrite


[3.3] Mac OS X
Kod Mac OS X-a je dodatak već instaliran i aktiviran, tako da nema nikakvih dodatnih koraka.



[4] Korišćenje URL rewrite-a


Da bismo videli kako URL rewrite radi, napravićemo jednu jednostavnu PHP stranicu:
<!DOCTYPE html> <html>     <head>         <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">         <title>Movies</title>     </head>     <body>         <?php         if (isset($_GET['genre']) && isset($_GET['year']))             echo 'Showing ' . $_GET['genre'] . ' movies from ' . $_GET['year'];         else             echo 'Missing parameters';         ?>     </body> </html>

Stranica proverava da li su prosleđeni parametri genre i year i ispisuje poruku Showing genre movies from year. U slučaju da neki od parametara nije naveden ispisuje poruku Missing parameters. Stranicu možete testirati tako što ćete u pretraživaču otvoriti URL: http://localhost/movies.php?genre=action&year=2013.

Naš cilj je da, uz URL rewrite, omogućimo pristup stranici preko sledećeg URL-a: http://localhost/movies/genre/year. To znači da ga moramo tako podesiti da prepozna parametre u URL-u i prosledi ih movies.php stranici na način koji joj odgovara (preko GET parametara).

URL rewrite koristi RegEx da odluči da li će neki URL prepisati ili ne. RegEx koji definiše oblik ulaznog URL-a se zove pattern odnosno šablon. U našem slučaju želimo da na početku šablona uvek bude tekst movies/ zatim ime žanra i godina odvojeni znakom /.

Krenimo redom… prvi deo šablona će izgledati ovako:
^movies/$

To znači da URL mora da počne tekstom movies/ (znak ^ znači počinje sa) i da se završi istim tekstom (znak $ znači završava se sa). Time smo efektivno ograničili prepisivanje URL-a samo na movies/.

Dodajmo još i ime žanra u priču. Ime žanra može sadržati bilo koje znakove i zbog toga ćemo u šablonu iskoristiti specijalan znak . koji dozvoljava sve znake. Uz njega ćemo dodati još jedan specijalan znak + koji kaže da se prethodno pravilo ponavlja više puta. Šablon sa uključenim žanrom izgleda ovako:
^movies/.+$

Za kraj nam ostaje još godina. Godina se sastoji iz više brojeva. Za definisanje niza dozvoljenih znakova se koriste specijalni znaci [ i ]. Ako želimo da dozvolimo samo brojeve u šablon moramo dodati [0-9]. Šablon sa godinom izgleda ovako:
^movies/.+/[0-9]+$

Uslov iz ovog šablona će biti ispunjen za sve URL-ove koji počinju tekstom movies/, zatim imaju niz bilo kojih znakova, posle toga /, i na kraju niz brojeva.

Drugi deo pravila za prepisivanje URL-a se zove rewrite url, i predstavlja URL koji će biti poslan serveru kada je uslov iz šablona zadovoljen. Za početak u ovom delu možemo napisati samo:
movies.php

To znači da će se otvoriti stranica movies.php bez parametara, svaki put kad uslov iz šablona bude ispunjen. Sada smo već korak bliže, ali moramo još preneti i parametre za stranicu.

Da bi deo šablona preneli, potrebno je da dodamo još par specijalnih znakova. Specijalni znaci koji se koriste za vraćanje rezultata iz šablona su ( i ). Svaki put kad uslov iz šablona bude zadovoljen, tekst koji se nalazi između zagrada se može iskoristiti kod sastavljanja URL-a za server. Moguće je više delova označiti na ovaj način, a parametrima se pristupa preko njihovog rednog broja. Parametar s rednim brojem 0 je ceo šablon, parametar s rednim brojem 1 je deo šablona koji se nalazi u prvim zagradama, s rednim brojem 2 je deo iz drugih zagrada, itd.

To znači da moramo malo da promenimo šablon:
^movies/(.+)/([0-9]+)$

Sada prilikom prepisivanja URL-a možemo iskoristiti ova dva parametra:
movies.php?genre=$1&year=$2
Informacija ::Idea Za pristip parametrima u IIS-u se umesto $n koristi {R:n}.

Microsoft Internet Information Services

Otvorite IIS i na levoj strani izaberite vaš web sajt. Na desnoj strani nađite ikonu URL Rewrite i dva puta kliknite na nju:

Podešavanje URL rewrite-a u Windows 8



Otvoriće se prozor za uređivanje pravila. Za dodavanje novog pravila je potrebno na desnoj strani kliknuti na link Add Rule(s)…:

Dodavanje pravila za URL rewrite u Windows 8



Prozor koji se otvorio nam omogućava da izaberemo jedno od predefinisanih pravila. U ovom slučaju izaberite Blank rule.

Izbor predefinisanih URL rewrite pravila u Windows 8



Konačno stižemo do dela u kojem ćemo definisati kako želimo da prepišemo URL. Prvi podatak koji je obavezan je ime pravila. Nazovimo ga Movies.

Sledeći obavezan podatak je Pattern. Upišimo šablon koji smo ranije objasnili:
^movies/(.+)/([0-9]+)$

Zadnji obavezan parametar je Rewrite URL, preko kojeg definišemo koja stranica će biti otvorena kada je uslov iz šablona zadovoljen:
movies.php?genre={R:1}&year={R:2}

Uređivanje pravila za URL rewrite u Windows 8



Na kraju je potrebno na desnoj strni pritisnuti Apply.


Apache

Kada je apache u pitanju, za podešavanje URL rewrite-a se najčešće koristi .htaccess datoteka. Ako se ta datoteka nalazi u nekom od direktorijuma koji se koriste za prikaz internet sadržaja, njen sadržaj dodaje nova podešavanja ili menja osnovna koja su podešena u datotekama za konfigurisanje Apache-a. Mi ćemo se sada ograničiti samo na podešavanje URL rewrite-a.

Da bismo uključili prepisivanje URL-a, potrebno je napraviti .htaccess datoteku u direktorijum iz kojeg Apache prikazuje internet sadržaj, i u nju upisati:
RewriteEngine On RewriteRule ^movies/(.+)/([0-9]+)$ movies.php?genre=$1&year=$2

Prvi red uključuje prepisivanje URL-a, dok je u drugom redu definisan šablon i URL koji će biti otvoren ako je uslov iz šablona zadovoljen.

Standardna podešavanja za Apache onemogućavaju uključivanje URL rewrite-a, i zbog toga je potrebno promeniti još jednu datoteku.


Windows

U datoteci C:\Apache24\conf\httpd.conf pronađite deo u kojem piše:
<Directory "c:/Apache24/htdocs">     #     # Possible values for the Options directive are "None", "All",     # or any combination of:     #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews     #     # Note that "MultiViews" must be named *explicitly* --- "Options All"     # doesn't give it to you.     #     # The Options directive is both complicated and important.  Please see     # http://httpd.apache.org/docs/2.4/mod/core.html#options     # for more information.     #     Options Indexes FollowSymLinks     #     # AllowOverride controls what directives may be placed in .htaccess files.     # It can be "All", "None", or any combination of the keywords:     #   Options FileInfo AuthConfig Limit     #     AllowOverride None     #     # Controls who can get stuff from this server.     #     Require all granted </Directory>

U tom delu promenite red u kojem piše:
AllowOverride None
u
AllowOverride All


Linux

Otvorite datoteku /etc/apache2/sites-available/default i potražite deo u kojem piše:
<Directory /var/www/> Options Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny allow from all </Directory>

U tom delu promenite red u kojem piše:
AllowOverride None
u
AllowOverride All


Mac OS X
Otvorite datoteku /private/etc/apache2/httpd.conf i pronađite deo u kojem piše sledeće:
<Directory "/Library/WebServer/Documents">     #     # Possible values for the Options directive are "None", "All",     # or any combination of:     #   Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews     #     # Note that "MultiViews" must be named *explicitly* --- "Options All"     # doesn't give it to you.     #     # The Options directive is both complicated and important.  Please see     # http://httpd.apache.org/docs/2.2/mod/core.html#options     # for more information.     #     Options Indexes FollowSymLinks MultiViews     #     # AllowOverride controls what directives may be placed in .htaccess files.     # It can be "All", "None", or any combination of the keywords:     #   Options FileInfo AuthConfig Limit     #     AllowOverride None     #     # Controls who can get stuff from this server.     #     Order allow,deny     Allow from all </Directory>

U tom delu promenite red u kojem piše:
AllowOverride None
u
AllowOverride All


Testiranje

Nakon podešavanja, možemo probati nekoliko linkova da vidimo kako URL rewrite radi:
http://localhost/movies/action/2013
http://localhost/movies/horror/1980
http://localhost/movies/misc/2000




[5] Jednostavan REST servis


Sad već imamo dovoljno znanja da napravimo jedan mali REST servis. Za sada se nećemo opterećivati bazama, menjanjem podataka i slično, nego ćemo napraviti mali servis koji će znati da nam vrati trenutno vreme na serveru i da izvršava osnovne matematičke operacije nad dva broja.

Prvo ćemo napisati pravila za prepisivanje URL-a. Za razliku od prethodnog primera, u kojem smo stranici prosleđivali delove URL-a, servisu ćemo proslediti sve i pustiti ga da sam odluči šta želi da uradi.

Kao RegEx za upoređivanje ćemo koristiti sledeći tekst:
^simplerest/(.+)$

Što znači da sve što počinje tekstom simplerest/ odgovara uslovu, a sve što ide posle toga će biti parametar command za servis.

Drugi deo pravila će proslediti parametar servisu simplerest.php:
simplerest.php?command=$1

Pošto ćemo koristiti GET metodu za komunikaciju sa servisom, moramo na neki način preneti i GET parametre. Na Apache serveru se to postiže tako što se na kraju pravila doda [QSA], dok se kod IIS-a čekira Append query string.

Sada ćemo napraviti datoteku simplerest.php u koju ćemo za početak napraviti samo osnovu servisa:
<?php class processor {     private $command = '';     function __construct()     {         if (isset($_GET['command']))             $this->command = $_GET['command'];     }         function run()     {         $cmd = explode('/', $this->command);         if (method_exists($this, $cmd[0]))             $this->$cmd[0]($cmd);         else             echo 'Invalid command';     } (new processor())->run(); ?>

Pravilo za prepisivanje, koje smo ranije napisali, i ova klasica nam omogućavaju da vrlo lako dodajemo novu funkcionalnost servisu.

Pogledajmo šta ova klasa tačno radi. U konstruktoru pročita command parametar koji dobije od Rewrite URL-a. U tom parametru se nalazi deo URL-a posle simplerest/. To znači da ako otvorimo stranicu http://localhost/simplerest/test/1/2/3, u command će biti upisano samo test/1/2/3.

Run funkcija na početku rastavi komandu na delove koristeći znak / kao separator i nakon toga sledi magija. Funkcijom method_exists proveravamo da li klasa ima funkciju koja se zove kao prvi deo komande i poziva je ako postoji prosleđujući joj rastavljenu komandu. U suprotnom se ispisuje poruka o grešci.

Na početku poglavlja smo rekli da ćemo napraviti servis koji zna da vrati trenutno vreme. Napravićemo još jednu funkciju u klasi koja se zove getdate:
private function getdate() {     echo (new DateTime())->format(DateTime::W3C); }

Kao što vidite, funkcija jednostavno ispiše trenutno vreme i to je to. Dodavanjem ove funkcije smo omogućili korisnicima našeg servisa da dobiju vreme sa servera koristeći adresu: http://localhost/simplerest/getdate.
Toliko je jednostavno dodati novu funkciju.

Možemo dodati i funkciju koja zahteva par parametara… recimo funkcija za sabiranje:
private function add($cmd) {     $res = 0;     foreach ($cmd as $value)         if (is_numeric($value))             $res += $value;     echo "$res"; }

Funkcija protrči kroz sve delove komande i sabere sve brojeve. Ova funkcija se koristi preko adrese: http://localhost/simplerest/add/10/15/30.
Rezultat je zbir svih brojeva koji se nalaze u komandi.

Ovakav način pisanja servisa (Rewrite URL prosledi servisu celu komandu, a servis se brine oko obrade i izvršavanja) se prilično često koristi jer ne zahteva previše rada za širenje/menjanje funkcionalnosti. Na početku poglavlja smo rekli da ćemo napraviti servis koji će znadi da obavlja osnovne matematičke operacije… vreme je da napišete i funkcije za oduzimanje, množenje i deljenje Smile



MySQL server
Nastaviće se...



Registruj se da bi učestvovao u diskusiji. Registrovanim korisnicima se NE prikazuju reklame unutar poruka.
offline
  • Pridružio: 13 Sep 2009
  • Poruke: 28

Bravo, inace sam ja za "ciste" url-ove, svaki direktorijum na hostu morao da oznacim sa ./putanja, inace mi je prikazivalo samo "ne inkludovane" fajlove...



offline
  • Srđan Tot
  • Am I evil? I am man, yes I am.
  • Pridružio: 12 Jul 2005
  • Poruke: 2483
  • Gde živiš: Ljubljana

Na koji deo teksta se odnosi taj deo o čistim url-ovima? Na rewrite pravila ili nešto drugo?

offline
  • Pridružio: 13 Sep 2009
  • Poruke: 28

Srki_82 ::Na koji deo teksta se odnosi taj deo o čistim url-ovima? Na rewrite pravila ili nešto drugo?

url rewrite

To zovu na sto nacina, preatty links, clean links, clean url, preaty url, url/link/mod rewrite

Ko je trenutno na forumu
 

Ukupno su 544 korisnika na forumu :: 9 registrovanih, 1 sakriven i 534 gosta   ::   [ Administrator ] [ Supermoderator ] [ Moderator ] :: Detaljnije

Najviše korisnika na forumu ikad bilo je 3466 - dana 01 Jun 2021 17:07

Korisnici koji su trenutno na forumu:
Korisnici trenutno na forumu: 357magnum, boris.zic, ikan, Istman, kihot, MB120mm, samsung, SR-3m, yrraf