Jednou z důležitých novinek v beta verzi ASP.NET MVC je bezesporu možnost přetěžování akcí a ve spolupráci s filtry na typ požadavku můžeme přejít na REST přístup k architektuře webové aplikace.
Ačkoli si mnoho lidí myslí, že když píšou v ASP.NET MVC, mají rovnou REST out of the box, není tomu tak. V plném RESTu se totiž nedostávají do URL slovesa (akce), nýbrž pouze předměty. Typický scénář CRUD operací může vypadat následovně:
POST /Customers/Create/
GET /Customers/Detail/1
POST /Customers/Update/1
GET /Customers/Delete/1
Takovéto akce snadno pokryjeme s výchozí routou
/{controller}/{action}/{id} a řadič
CustomersController může vypadat nějak tak:
public class CustomersController : Controller {
public ActionResult Create(Customer customer) {
// TODO: create customer
}
public ActionResult Detail(int id) {
// TODO: find customer by id
}
public ActionResult Update(int id, Customer customer) {
// TODO: update customer
}
public ActionResult Delete(int id) {
// TODO: delete customer
}
}
Jenže POSTování a GETování je jen slabou podmnožinou povolených operací na HTTP protokolu. Správný REST přístup pro CRUD operace by měl vypadat následovně:
POST /Customers
GET /Customers/1
PUT /Customers/1
DELETE /Customers/1
Co je pro to třeba udělat?
Začneme od routy. Přidáme novou routu pro
CustomersController:
routes.MapRoute(
"REST Customers",
"Customers/{id}",
new { controller = "Customers", action = "Rest", id = "" }
);
A původní kód obohatíme o pár atributů:
public class CustomersController : Controller {
[ActionName("Rest")]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Create(Customer customer) {
// TODO: save Customer to database
return Json(new { status = "ok" });
}
[ActionName("Rest")]
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Detail(int id) {
// TODO: load Customer from database
return View("Detail");
}
[ActionName("Rest")]
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult Index() {
// TODO: load Customers from database
return View("Index");
}
[ActionName("Rest")]
[AcceptVerbs(HttpVerbs.Put)]
public ActionResult Update(int id, Customer customer) {
// TODO: update Customer in database
return Json(new { status = "ok" });
}
[ActionName("Rest")]
[AcceptVerbs(HttpVerbs.Delete)]
public ActionResult Delete(int id) {
// TODO: delete Customer from database
return Json(new { status = "ok" });
}
}
A máme REST :)











Komentáře
Borek
18.55 - 26. října 2008 | #
Petr
14.14 - 27. října 2008 | #
Aleš Roubíček
16.34 - 27. října 2008 | #
Danielle
21.03 - 28. října 2008 | #
Aleš Roubíček
08.53 - 29. října 2008 | #
Dušan Janošík
09.44 - 30. října 2008 | #
Aleš Roubíček
10.25 - 30. října 2008 | #
Dušan Janošík
10.28 - 30. října 2008 | #
Petr
09.05 - 3. listopadu 2008 | #
Aleš Roubíček
13.01 - 3. listopadu 2008 | #
ja
22.20 - 4. ledna 2009 | #
Aleš Roubíček
06.46 - 5. ledna 2009 | #
Místo pro tvůj názor