2013-01-15 21 views
11

Załóżmy, że mam zagnieżdżony jeden do wielu -Type bazie hierarchii następująco:Niestandardowe routingu z ASP.NET Web API

Jeden Region ma wiele countries; każdy Kraj ma wiele miast; a Miasto musi należeć do jednego i tylko jednego kraju.

Abstrahując tę ​​informację do RDBMS jest trywialne ćwiczenia, ale (moim zdaniem) najbardziej sensowny punkt końcowy REST, aby powrócić do listy krajów o danym regionie id byłoby coś jak poniżej:

HTTP GET http://localhost/Region/3/Countries 

Domyślnie routing w interfejsie .NET Web API byłby w najlepszym wypadku http://localhost/Countries/Region/3 lub http://localhost/Region/Countries/3.

Czy istnieje rozsądna konwencja nazewnictwa, którą powinienem wykonać, czy też routing jest wystarczająco elastyczny, aby umożliwić identyfikację URI w dowolnym kształcie?

+0

Przypuszczam, że powinienem dodać, że pracuję z istniejącym DBMS i chcę budować publiczne/prywatne API do magazynu danych. –

Odpowiedz

17

Routing powinien być dostosowywany na tyle, aby uzyskać adresy URL, których szukasz. Zakładając, że chcesz adresy URL w postaci „http: // localhost/Region/3/Kraje”, można zarejestrować ten niestandardowy trasę:

config.Routes.MapHttpRoute("MyRoute", "Region/{regionId}/Countries", new { controller = "Region", action = "GetCountries" }); 

będzie tą dostępnością wniosków do działania „metodę: getCountries” na „” RegionController klasa. Możesz mieć parametr regionId na akcji, która automatycznie pobiera dla ciebie model z identyfikatora URI.

Możesz chcieć sprawdzić online pakiet atrybutu routingu dla WebAPI, ponieważ może być bardziej odpowiedni w twoim przypadku.

3

Trasowania powinny być dość elastyczne - pytanie, w jaki sposób chcesz podawać dane. Czy masz jednego kontrolera na myśli lub wiele?

Jeśli miał RegionController ja nie rozumiem, dlaczego nie można skonfigurować trasę:

routes.MapHttpRoute(
    name: "CountryList", 
    routeTemplate: "{controller}/{regionId}/countries" 
); 

i odpowiedni sposób:

public CountryCollection Get(int regionId) 

Albo ja czegoś brakuje w swoim pytaniu ? Skąd pochodzi twój domyślny routing?

Wystarczy popatrzeć na ich dokumentacji:

http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-and-action-selection http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-in-aspnet-web -api