asp.net-web-api
Routing dell'URL API Web
Ricerca…
Come funziona il routing in asp.net webapi
Nell'API Web ASP.NET, un controller è una classe che gestisce le richieste HTTP. I metodi pubblici del controller sono chiamati metodi di azione o semplicemente azioni.
Quando il framework API Web riceve una richiesta, indirizza la richiesta a un'azione. Per determinare quale azione invocare, il framework utilizza una tabella di routing. Il modello di progetto di Visual Studio per Web API crea una route predefinita:
routes.MapHttpRoute(
name: "API Default",
routeTemplate: "**api/{controller}/{id}**",
defaults: new { id = RouteParameter.Optional }
);
Questa route è definita nel file WebApiConfig.cs, che viene inserito nella directory App_Start:
Ogni voce nella tabella di routing contiene un modello di percorso. Il modello di route predefinito per l'API Web è " api / {controller} / {id} ". In questo modello, " api " è un segmento di percorso letterale e { controller } e { id } sono variabili segnaposto.
Quando il framework API Web riceve una richiesta HTTP, prova a far corrispondere l'URI con uno dei modelli di instradamento nella tabella di routing. Se nessuna route corrisponde, il client riceve un errore 404.
Ad esempio, i seguenti URI corrispondono alla route predefinita:
- / API / valori
- / Api / valori / 1
Tuttavia, il seguente URI non corrisponde, perché manca il segmento " api ":
- / Valori / 1
Una volta trovata una rotta corrispondente, l'API Web seleziona il controller e l'azione:
- Per trovare il controller, l'API Web aggiunge "Controller" al valore della variabile {controller}.
- Per trovare l'azione, l'API Web esamina il metodo HTTP e quindi cerca un'azione il cui nome inizia con il nome del metodo HTTP. Ad esempio, con una richiesta GET, l'API Web cerca un'azione che inizia con "Get ...", come "GetEmployee" o "GetAllEmployees". Questa convenzione si applica solo ai metodi GET, POST, PUT e DELETE.
È possibile abilitare altri metodi HTTP utilizzando gli attributi sul controller. Ne vedremo un esempio dopo.
- Altre variabili segnaposto nel modello di percorso, come {id}, sono mappate ai parametri di azione.
Metodi HTTP Invece di utilizzare la convenzione di denominazione per i metodi HTTP, è possibile specificare esplicitamente il metodo HTTP per un'azione decorando il metodo di azione con l'attributo HttpGet, HttpPut, HttpPost o HttpDelete.
Nell'esempio seguente, il metodo EmployeeGetEmployee viene associato alle richieste GET:
public class EmployeesController : ApiController
{
[HttpGet]
public EmployeeGetEmployee(id) {}
}
Per consentire più metodi HTTP per un'azione o per consentire metodi HTTP diversi da GET, PUT, POST e DELETE, utilizzare l'attributo AcceptVerbs, che accetta un elenco di metodi HTTP.
public class EmployeesController: ApiController
{
[AcceptVerbs("GET", "HEAD")]
public Employee GetEmployee (id) { }
}
Routing per nome dell'azione
Con il modello di instradamento predefinito, l'API Web utilizza il metodo HTTP per selezionare l'azione. Tuttavia, puoi anche creare una rotta in cui il nome dell'azione è incluso nell'URI:
routes.MapHttpRoute(
name: "ActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
In questo modello di percorso, il parametro {action} indica il metodo di azione sul controller. Con questo stile di routing, utilizzare gli attributi per specificare i metodi HTTP consentiti. Ad esempio, supponiamo che il controller abbia il seguente metodo:
public class EmployeesController: ApiController
{
[HttpGet]
public List<Employee> GetAllEmployees();
}
In questo caso, una richiesta GET per " api / Employees / GetAllEmployees " si assocerebbe al metodo GetAllEmployees.
Puoi sovrascrivere il nome dell'azione usando l'attributo ActionName. Nell'esempio seguente, esistono due azioni che si associano a " api / Employees / ShowAllEmployees / id . Uno supporta GET e l'altro supporta POST:
public class EmployeesController : ApiController
{
[HttpGet]
[ActionName("ShowAllEmployees")]
public List<Employee> GetAll(int id);
[HttpPost]
[ActionName("ShowAllEmployees")]
public void GetAll (int id);
}
Non-azioni
È possibile impedire che un metodo venga richiamato come azione utilizzando l'attributo NonAction. Questo segnala al framework che il metodo non è un'azione, anche se altrimenti corrisponderebbe alle regole di routing.
[NonAction]
public string GetValues() { ... }
Esempi di routing basati sui verbi.
Lo stesso URl per diversi metodi http agisce in modo diverso. Di seguito è riportata una tabella raffigurante la stessa.
| VERBO HTTP | URL | DESCRIZIONE |
|---|---|---|
| OTTENERE | / API / studenti | Restituisce tutti gli studenti |
| OTTENERE | / API / studenti / 5 | Restituisce i dettagli dell'ID studente = 5 |
| INVIARE | / API / studenti | Aggiungi un nuovo studente |
| METTERE | / API / studenti / 5 | Aggiorna studente con Id = 5 |
| ELIMINA | / API / studenti / 5 | Elimina studente con Id = 5 |