2013-01-15 14 views
11

Supponiamo che ho un nidificato uno a molti database di gerarchia tipo come segue:personalizzato di routing con ASP.NET Web API

Uno Regione ha molti Paesi ; ogni Paese ha molte Città; a La città deve appartenere allo un solo paese.

Astraendo queste informazioni in un RDBMS è un esercizio banale, ma (a mio avviso) REST endpoint più ragionevole per restituire un elenco di paesi per un data regione id sarebbe qualcosa di simile al seguente:

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

Per impostazione predefinita, il routing dell'API Web .NET sarebbe, nella migliore delle ipotesi, http://localhost/Countries/Region/3 o http://localhost/Region/Countries/3.

C'è una convenzione di denominazione ragionevole che dovrei seguire, oppure il routing è abbastanza personalizzabile da consentire agli URI di assumere qualsiasi forma che mi piace?

+0

Suppongo che dovrei aggiungere che sto lavorando con un DBMS esistente e voglio costruire API pubbliche/private sul datastore. –

risposta

17

Il routing deve essere abbastanza personalizzabile per ottenere gli URL che stai cercando. Supponendo che si desidera URL nella forma 'http: // localhost/Regione/3/Countries', è possibile registrare questo percorso personalizzato:

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

Questo sarebbe inviare le richieste per l'azione 'GetCountries' sul 'RegionController' classe. È possibile avere un parametro regionId sull'azione che ottiene automaticamente il modello associato all'utente dall'URI.

Si consiglia di cercare online il pacchetto di instradamento degli attributi per WebAPI poiché potrebbe essere più appropriato nel proprio caso.

3

I percorsi dovrebbero essere abbastanza flessibili: la domanda sarebbe come si desidera servire i dati. Hai in mente un controller o più?

Se tu avessi un RegionController non vedo il motivo per cui non si poteva configurare un percorso:

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

e un corrispondente metodo:

public CountryCollection Get(int regionId) 

O mi manca qualcosa nella tua domanda ? Da dove viene il routing predefinito?

Dai un'occhiata alla loro documentazione:

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