Lucian Maran

home

ASP.NET Web Api - apeluri RESTfull si RPC pentru aceeasi resursa

16 Sep 2012

In mod standard, ASP.NET Web Api nu permite actiuni multiple, cu aceeasi semnatura, catre aceeasi resursa (Controller). Altfel, returneaza eroarea: "Multiple actions were found that match the request...".

In contextul WebApi, doua metode au aceeasi semnatura daca:

Atentie, nu conteaza tipul returnat sau tipul parametrilor!

Bine, dar concret, in ce situatie as avea nevoie de asa ceva?

Exemplu (problema):

Vreau sa pun la dispozitie 2 API-uri care raspund la GET si care au un singur parametru:

Solutia:

Pentru Api1 voi folosi ruta default iar pentru Api2 voi adauga o noua ruta de tip "RPC":

config.Routes.MapHttpRoute(
   name: "RpcApi",
   routeTemplate: "v1/rpc/{controller}/{action}/{id2}" //obligatoriu, numele param. tb. sa fie diferit
);

config.Routes.MapHttpRoute(
   name: "DefaultApi",
   routeTemplate: "v1/{controller}/{id}",
   defaults: new { id = RouteParameter.Optional }
);

iar in Controller:

public string GetByCode(string id2) //RPC
{
    return "value by code (RPC call)";
}

public string Get(int id) //RESTfull
{
    return "value by id (RESTfull call)";
}

Rezultatul:

Apel RESTfull:

Apel RPC:

Discutii pe marginea solutiei:

In concluzie, solutia prezentata mai sus patreaza nealterata operarea cu resurse in modul standard (RESTfull) dar ofera si o modalitate pentru introducerea de operatii suplimentare.

Solutii alternative:

1. Rutare pe baza de actiune (RPC 100%)

Avantaje:

Dezavantaje:

2. Controller-e multiple pentru aceeasi resursa (RESTfull 100%)

Avantaje:

Dezavantaje:

Referinte:

REST vs. RPC in ASP.NET Web API? Who cares; it does both. (Dave Ward, Encosia blog, 04.2012)

An Introduction to ASP.NET Web API partea de rutare (Rich Strahl, 08.2012)

Passing multiple POST parameters to Web API Controller Methods, prima parte (Rich Strahl, 05.2012)

Routing and Action Selection (Mike Wasson, 07.2012)

Opinionated (RPC) APIs vs RESTful APIs (03.2012)

comments powered by Disqus