Uvod
Web servisi su komponente koje omogućavaju komunikaciju među udaljenim računarima. Tipični web servisi su proceduralne komponente u kojima možete da napravite standardne C# metode koje se mogu pozivati preko URLa, poslati im se parametri i prihvatiti rezultat. Primer takvih web servisa su SOAP web servisi o kojima možete naći više informacija ovde. Ovakvi web servisi su osnova za pravljenje servisno orijentisane arhitekture (SOA) gde se distribirani sistem implementira kao skup javnih procedura postavljenih na udaljene servere koji se međusobno pozivaju preko mreže.
Alternativa servisno orijentisanoj arhitekturi (SOA) je resursno orijentisana arhitektura (ROA) gde je ideja da se web servisi ne implementiraju kao skup procedura koje se mogu pozivati, nego kao skup resursa (entiteta) kojima se može pristupati. U ROA arhitekturi postoji nekoliko principa:
- Svaka informacija predstavlja resurs.
- Informacije nisu samo statičke strane nego fajlovi koji sadrže informacije, tabele u bazi podataka ili bilo koji drugi podaci kojima treba pristupiti.
- Resursi predstavljaju stvarne informacije kojima se može pristupiti u sistemu. Svaki resurs ima jedinstvani URL (ili URI) koji ga identifikuje i pomoću kog mu se može pristupiti. Način pristupa resursima se definiše pomoću HTTP protokola
- Servisi nemaju stanje - svaki poziv servisu predstavlja jednu zaokruženu akciju koja ili čita ili menja podatke
U nastavku će biti detaljnije objašnjeni REST servisi.
REST Web servisi
Ideja REST web servisa je da se umesto skupa web procedura koje se mogu pozivati, direktno omogući pristup resursima. Na primer, pretpostavimo da je potrebno omogućiti da se preko web servisa čitaju infrmacije o proizvodima, kreiraju novi proizvodi, ažuriraju i brišu postojeći proizvodi. Ovo je čest zahtev u aplikacijama koje moraju da imaju kompletnu CRUD kontrolu nad podacima. U standardnim web servisima bi bilo potrebno kreirati skup metoda za pristup proizvodima kao što su:
- GetProduct ili GetProducts
- InsertProduct
- UpdateProduct
- DeleteProduct
Ove metode omogućavaju kompletnu kontrolu nad proizvodima. Svaka od ovih metoda ima poseban URL kojim se poziva.
U REST web servisima ideja je malo drugačija. Umesto posebnih metoda i URLova za svaku operaciju može se definisati jedan URL koji identifikuje resurs.
Na primer, ako se web servis nalazi na adresi http://www.url-servera.com gde je potrebno omogućiti pristup proizvodima, osobama i kompanijama koristili bi se sledeći URLovi:
- http://www.url-servera.com/Proizvod - za pristup proizvodima
- http://www.url-servera.com/Osoba
- za pristup osobama
- http://www.url-servera.com/Kompanija - za pristup kompanijama
Umesto drugačijih URLova za svaku operaciju u REST servisima se koriste različite metode HTTP protokola. Po HTTP protokolu postoji više metoda kojima se može zahtevati resurs po URLu. Najčešći metodi su GET metod kojim se čita određena strana i POST kojim se šalju podaci serveru. Po HTTP protokolu postoje još neki metodi kao što su PUT, DELETE ili HEAD ali se retko koriste.
REST servisi upravo koriste ove metode kako bi prepoznali da li klijent želi da pročita, kreira, ažurira ili obriše neki podatak.
Na primer, pretpostavimo da se sledeći URL koristi da bi se pristupilo proizvodu sa ID-jem 17 - http://www.url-servera.com/Proizvod/17. Format URLa nije standardizovan i zavisi od konkretnog REST web servisa i može biti drugačiji na primer http://www.url-servera.com/Proizvod(17). Korišćenjem ovog URLa i različitih HTTP protokola može se definisati REST servisu šta treba da uradi sa ovim proizvodom kao što je prikazano u sledećoj tabeli:
| Operacija |
Protokol |
Opis |
|
Čitanje |
GET |
Od web servisa se traži da vrati podatke o proizvodu |
| Ažuriranje |
PUT |
Web sevisu se šalju podaci o proizvodu koji ih ažurira |
|
Kreiranje |
POST |
Web servisu se šalju podaci o novom proizvodu koji ga kreira |
|
Brisanje |
DELETE |
Od web servisa se se traži da obriše podatak |
Kao što se može videti isti URL se koristi za sve operacije samo se menja HTTP protokol koji govori REST servisu šta je potrebno uraditi. Ovo je bitno zato što omogućava klijentima napisanim u različitim jezicima (C#, Java, JavaScript, PHP) da koriste web servis pošto svi mogu da koriste standardne HTTP protokole a pri tome ne mora da se brine o tome da li će klijent biti u mogućnosti da parsira XML strukturu.
Format u kome se podaci vraćaju zavisi od samog servisa i može biti XML, JSON ili bilo koji format koji odgovara pozvaocu.
Primer REST web servisa
REST servisi se mogu naći kao javni servisi. Na primer Netflix ima javni servis koji omogućava da se preuzmu informacije o ljudima, žanrovima i filmovima. U ovom primeru ljudi, žanrovi i filmovi su resursi.
Na primer preko sledećih URLova se može dobiti lista osoba, žanrova i naslova:
Netflix REST servis omogućava da se preuzmu i informacije o pojedinim resursima tako što se doda identifikator određenog resursa u URL:
Format koji REST servis koristi kao identifikator nije standardizovan - Netflix koristi identifikatore u zagradama (zato što je tako specificirano po takozvanom OData protokolu koji se može posmatrati kao specifičnija verzija REST protokola). Netflix REST servis podrazumevano vraća podatke u XML formatu ali možete da tražite da formatira odgovor u JSON formatu:
Kao što možete videti, iako je web servis namenjen programskim komponentama, možete ga pozvati direktno iz pregledača i lako videti rezultate koje vraća. Netflix web servis je više od običnog REST servisa - on pripada klasi OData servisa koji pružaju neke naprednije mogućnosti klijentu kao što su upiti preko URLa i slično. Međutim, ako se ignorišu napredne mogućnosti koje pruža OData, Netflix se može posmatrati i kao standardan REST servis.
Prednost u odnosu na SOAP servise
REST web servisi imaju nekoliko nad standardnim web servisima (npr. SOAP) web servisi.
REST web servisi su jednostavniji od SOAP servisa, nema složenog formatiranja parametara i rezultata u SOAP-XML format. Klijenti koji pozivaju REST servise ne moraju da formatiraju zahteve po SOAP specifikaciji i što je najbitnije ne moraju da parsiraju SOAP odgovor kako bi iz njega izvukli rezultat. Ovo omogućava da jednostavni klijenti kao što su JavaScript Ajax pozivi direktno pozivaju REST servise i prihvate rezultate.
Pored toga podaci koji se vraćaju mogu biti u formatu koji odgovara klijentu. Na primer JavaScript kod može dobiti podatke u JSON formatu koji lako može da pročita, RSS čitač u RSS-XML formatu koji može da prikaže. S obzirom da je format u kome se vraćaju podaci fleksibilan, različiti klijenti mogu da zatraže podatke u formatu koji im najviše odgovara što je dosta lakše od SOAP formata koji iako je standardizovan mora da se parsira.
Kreiranje REST web servisa
REST predstavlja princip tako da REST servise možete napraviti u bilo kom jeziku i sa bilo kojom tehnologijom sve dok poštujete pravila. U C# jeziku najlakše je napraviti REST servis korišćenjem WCF servisa.
Ako koristite Visual Studio, potrebno je da napravite web aplikaciju u kojoj je dovoljno dodati novi WCF servis (Add > New Item > Web > WCF Service) i biće kreirana dva fajla:
Interfejs kojim se opisuju metode REST servisa
Implementacija u kojoj se nalazi kod koji realizuje operacije.
Pod pretpostavkom da je napravljen WCF servis ProizvodRESTServis, interfejs bi bio generisan u fajlu IProizvodRESTServis.cs i izgledao bi kao u sledećem listingu:
[ServiceContract]
public interface IProizvodRESTServis
{
[OperationContract]
[WebInvoke(Method = "GET",
UriTemplate = "/Proizvod/{id}",
ResponseFormat = WebMessageFormat.Json)]
string VratiDetaljeProizvoda(string id);
}
U ovom primeru je napravljen interfejs koji opisuje web servis koji će vratiti detalje proizvoda metodom VratiDetaljeProizvoda. Pri tome samo ime metode je beznačajno - ona se ne poziva po imenu nego po URI šablonu /Proizvod/{id}. Metoda će vratiti podatke o proizvodu u JSON formatu kada se otvori neki url kao na primer /ProizvodRESTServis.svc/Proizvod/17 .
Pošto metoda vraća podatke o proizvodu ona je podešena tako da reaguje na HTTP GET metod.
WCF Servisi omogućavaju još dosta prilagođavanja servisa. Više detalja o implementaciji možete naći u artiklima Create RESTful WCF Service API: Step By Step Guide ili CREATE RESTful WCF Service API Using POST: Step By Step Guide. Tamo možete naći detaljnija uputstva o tome kako se može napraviti REST pomoću WCF servisa.
Pored klasičnih REST servisa postoje i takozvani OData servisi koji pored jednostavnih upita omogućavaju i složenije upite. OData servisi se mogu posmatrati kao specijalan slučaj naprednih REST servisa. Više informacija o OData servisima možete naći u artiklu OData services. Primer OData servisa je Netflix web servis predstavljen u prethodnoj sekciji.
Korišćenje REST servisa
Zahvaljujući svojoj jednostavnosti REST servisi se ne moraju koristiti kao klasični SOAP servisi kreiranjem proksija, serijalizacijom i deserijalizacijom podataka kao što je opisano ovde. Umesto toga REST servise možete pozvati direktnim unošenjem URLa u pregledač.
Međutim češće se pozivaju iz programskog koda gde je potrebno samo definisati koji URL treba otvoriti i kojim protokolom. Primer Ajax poziva koji poziva REST servis koji vraća detalje o proizvodu sa ID-jem 17 je prikazan u sledećem primeru:
$.ajax({
type: "GET",
url: "/ProizvodRESTServis.svc/Proizvod/17",
success: function(odgovor){
alert(odgovor.NazivProizvoda);
}
})
REST servisi su idealni u slučaju da ih je potrebno pozvati putem Ajax poziva zato što imaju jednostavan protokol komunikacije. Sve što treba uraditi u Ajax pozivu je da se postavi URL resursa, Http protokol koji će biti korišćen i sačekati odgovor od servera. Usled jednostavnosti protokola nije potrebno nikakvo formatiranje i parsiranje tako da je REST servise najjednostavnije koristiti u Ajax pozivima.
Zaključak
REST servisi predstavljaju veoma korisnu alternativu standardnim SOAP servisima. Osnovna prednost REST servisa je u slučajevima kada treba omogućiti punu kontrolu nad informacijama, ili kada treba pojednostaviti protokol komunikacije sa servisom kako bi i jednostavni klijenti kao JavaSkript Ajax pozivi mogli da uzimaju podatke sa servisa i dinamičkiih prikazuju. REST servisi su sigurno nešto na šta ćete naići tokom rada u web aplikacijama tako da je korisno znati šta mogu da pruže. Ovo je samo kratak pregled osnovnih koncepata ali REST servisi pružaju mnogo više tako da je korisno istražiti ih.
Literatura
- REST
- SOAP WEB Servisi
- Create RESTful WCF Service API: Step By Step Guide
- CREATE RESTful WCF Service API Using POST: Step By Step Guide
- OData services
Komentari će biti prikazani pošto ih odobri moderator sajta. Da bi komentari bili objavljeni, moraju biti u skladu sa politikom objavljivanja.