ASP.NET MVC Framework Beta i REST aplikacija - Uvod
Na REST predavanju koje sam držao na Sinergiji08 (u trenutku objavljivanja ovog posta, verovatno već davno završenoj), pomenuo sam nekoliko tehnologija koje dolaze iz MS kuhinje. Najviše akcenta sam stavio na WCF 3.5 ekstenzije za REST servise (možete da pogledate demoe i PPT ovde), ali sam pomenuo i ADO.NET Data Services kao i ASP.NET MVC Framework, Pva opcija je bila pokrivena i kratkim demoom i zasebnim predavanjem, ali druga je bila samo pomenuta.
Vreme je da se to promeni.
MVC je trenutno izašao u Beta 1 formi, te je vreme idealno za jednu test aplikaciju.
Malo podsećanje - razmena likova
REST servis koji hoću da izgradim će biti identičan po funkcionalnostima kao i WCF rešenje koje sam već napravio. Ukratko, imamo skromnu bazu sa svega tri tabele u kojima se nalazi nekoliko tipa informacija. Sve se vrte oko Star Trek-a, naravno. :) U jednoj tabeli, Characters, imamo skup likova iz svih serijala i filmova ovog SF ostvarenja. Zatim imamo jednu tabelu sa brodovima, odnosno stanicama i sličnim stvarima na/u kojima se likovi nalaze. Konačno, treća tabela predstavlja frakcije iz serije. Naravno, svi likovi iz tabele Characters su vezani za ove dve druge tabele. Dijagram baze, onda, izgleda ovako:
Dakle, jako prosta baza. Naš cilj je da dopustimo neograničenom broju anonimnih korisnika da ulaze u interakciju sa Charaters tabelom, bilo da dobiju listu likova koje imamo u bazi, detalje jednog lika, da dodaju novog ili da obrišu postojećeg. Sve ovo možemo da uradimo kroz skup web servisa baziranih na SOAP-u (da ne kažem "klasičnih" web servisa), ali pošto imamo posla sa velikom količinom anonimnih korisnika, odabrali smo REST princip kao osnovni da modelujemo naš servis.
Malo podsećanje - MVC patern i MVC Framework
MVC pattern spada u grupu najpoznatijih design pattern-a. Model View Controller, što je u stvari puno ime akronima, je nastao davnih godina prvenstveno za GUI aplikacije koje su došle na scenu nastankom jednog simpatičnog jezika/okruženja zvanog Smalltalk (kod ovog jezika, dinstinkcija između jezika i okruženja nije toliko snažna kao kod modernih alata). Pošto je u pitanju bila nova paradigma, bio je potreban i nov način na koji bi se modelovale aplikacije i korisnička interakcija sa njima. Dok je bio u poseti XEROX PARC-u, Trygve M. H. Reenskaug je sačinio ovaj obrazac. Ono što nam on daje je jasno razgraničenje između sfera interesovanja u našoj aplikaciji. Model je odgovoran za podatke i predstavlja osnovni prozor ka kolekciji podataka sa kojom radimo. View služi samo prikazu podataka, ili bilo čega, krajnjem korisniku. On sam ne zna ništa o podacima, niti treba da zna. Controller je spona između dva sveta, i on uzima podatke od Modela, prosleđuje ih određenom View-u, preuzima rezultat neke interakcije korisnika od View-a, prosleđuje ih Modelu koji potom nešto radi sa njima.
Kako radi ASP.NET MVC Framework? Prva stvar koju treba odmah objasniti (i koju sam objasnio u prethodnom postu), je da MVC sistem ne koristi tradicionalne načine rada na koje ste verovatno navikli u ASP.NET aplikacijama. Ne postoji koncept postback-a, ne postoji koncept ViewState-a. Nista ograničeni jednim formularom po strani. Iako i dalje možete da koristite web kontrole u svojim View stranama, generalno je preporučeno da se koristi "čist" HTML kod, što vam daje jednu prednost u odnosu na web server kontrole, a to je da možete kompletno, 100% da imate kontrolu nad HTML-om koji aplikacija generiše, čime se olakšava i rad sa JavaScript-om, odnosno manipulacija DOM-a/CSS-a, i rad sa CSS-om, odnosno stilizovanje aplikacije. Naravno, neke stvari nisu "ukinute", master strane i dalje mogu da se koriste (osnovni templejt koji dobijate kad instalirate ovaj framework čak i koristi master pages). Slično je i sa sistemima poput Membership-a. Još jedna prednost ovog sistema rada jeste da je olakšan unit testing web aplikacije, jer se testiraju metode u kontroleru, bez čitave ASP.NET mašinerije.
Kada stigne zahtev do web servera, prvo se radi rutiranje do određenog metoda koji je određen da obradi neki zahtev. Ukoliko do web servera stigne zahtev za URL-om http://localhost/CharacterExchange/Characters, MVC će pozvati onaj metod koji se ili zove "Characters" ili koji je označen putem atributa kao metod koji odgovara na ovaj deo URL-a. Slično je i ako dobijemo URL koji izgleda, recimo, kao http://localhost/CharacterExchange/Characters/34, onda će MVC naći metod koji se zove Characters i proslediti mu parametar "34". Slično je i sa ostalim parametrima. Kada jednom metod kontrolera krene sa izvršavanjem, on može (ali i ne mora, zavisno od toga koliko čvrsto želite da se držite obrasca) da "pita" Model za podatke, recimo da dobije listu likova ili jednog lika pod rednim brojem "34", zatim da prosledi te podatke view-u, koji će ih prikazati kako želimo. Slično je i sa obratnim smerom komunikacije.
Nažalost, ovaj post nije baš uvod u sam MVC framework, tako da neću trošiti više vremena da uputim verne čitaoce u osnove korišćenja. Ukoliko vas zanima da naučite više o ovome (toplo preporučujem, naravno), predlažem da posetite sledeće linkove:
Sada kratak opis REST demoa/servisa/aplikacije koji ćemo napraviti.
REST demo/servis/aplikacija
Dakle, kao što smo rekli, naš servis bi trebalo da pruži četiri osnovne mogućnosti korisnicima. Prva je da dobiju listu likova iz baze, druga je da promene podatke za bilo kog lika, treća je da dodaju novog lika i konačna je da mogu da obrišu bilo kog lika. Da bismo stvar držali relativno prostom, nećemo praviti sistem autentifikacije, iako bi realno bilo jako dobro da se isti napravi pre nego što se pruži mogućnost menjanja stanja podataka koji su uskladišteni u našoj bazi.
Pošto želimo da ovaj servis bude dostupan velikoj količini anonimnih korisnika preko Interneta, koristićemo nekoliko REST principa. Prvo, mapiraćemo naše 4 osnovne radnje na HTTP metode (GET, POST, PUT i DELETE), drugo koristićemo dva poznata formata da bismo predstavili naše resurse, XML i JSON i kao poslednje, bavićemo se reprezentacijama resurasa, a ne samim resursima. Konačno, sam MVC framework je, po nekima, REST pristup radu sa ASP.NET sajtovima. U toku ovog provg koraka, neću težiti da implementiram 100% HI REST servis; recimo, neću se truditi da iskoristim koncept hipermedije, odnosno linkovanja resursa do kraja. Servis će raditi sa reprezentacijama samo jednog resursa, likova.
U sledećem blog postu krećemo sa implementacijom metoda koji će podržavati prvi HTTP metod, GET.
Do tada,
Out.
B.D.