Controller per API Web ASP.NET Core

Completato

Nell'esercizio precedente è stata creata un'applicazione Web che fornisce dati di esempio relativi alle previsioni meteo, quindi si è visto come interagire con questa applicazione in HTTP REPL.

Prima di approfondire la scrittura di una classe PizzaController personalizzata, verrà esaminato il codice dell'esempio WeatherController per comprenderne il funzionamento. In questa unità si apprenderà come WeatherController usa la classe di base ControllerBase e alcuni attributi .NET per creare un'API Web funzionale con poche decine di righe di codice. Dopo aver compreso questi concetti, si è pronti per scrivere una classe PizzaController personalizzata.

Ecco il codice per l'intera classe WeatherController. Non preoccuparsi se al momento non ha senso. Tutta la procedura verrà illustrata in dettaglio.

using Microsoft.AspNetCore.Mvc;

namespace ContosoPizza.Controllers;

[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
    private static readonly string[] Summaries = new[]
    {
        "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
    };

    private readonly ILogger<WeatherForecastController> _logger;

    public WeatherForecastController(ILogger<WeatherForecastController> logger)
    {
        _logger = logger;
    }

    [HttpGet(Name = "GetWeatherForecast")]
    public IEnumerable<WeatherForecast> Get()
    {
        return Enumerable.Range(1, 5).Select(index => new WeatherForecast
        {
            Date = DateTime.Now.AddDays(index),
            TemperatureC = Random.Shared.Next(-20, 55),
            Summary = Summaries[Random.Shared.Next(Summaries.Length)]
        })
        .ToArray();
    }
}

Classe di base: ControllerBase

Un controller è una classe pubblica con uno o più metodi pubblici chiamati azioni. Per convenzione, un controller viene posizionato nella directory Controllers della radice del progetto. Le azioni vengono esposte come endpoint HTTP tramite il routing. Una richiesta HTTP GET a https://localhost:{PORT}/weatherforecast genera quindi l'esecuzione del metodo Get() della classe WeatherForecastController.

La prima cosa da notare è che questa classe eredita dalla classe di base ControllerBase. Questa classe di base offre molte funzionalità standard per la gestione delle richieste HTTP, per consentire all'utente di concentrarsi sulla logica di business specifica per l'applicazione.

Nota

Se si ha esperienza di sviluppo con Razor Pages o l'architettura MVC in ASP.NET Core, si conosce già la classe Controller. Non creare un controller API Web tramite derivazione dalla classe Controller. La classe Controller deriva da ControllerBase e aggiunge il supporto per le visualizzazioni, di conseguenza è progettata per la gestione delle pagine Web e non per le richieste di API Web.

Attributi della classe controller API

A WeatherForecastController vengono applicati due attributi importanti, come illustrato nel codice seguente:

[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase

[ApiController] consente comportamenti particolari che rendono più semplice creare API Web. Alcuni comportamenti includono l'inferenza dell'origine del parametro, il routing degli attributi come requisito e i miglioramenti della gestione degli errori di convalida del modello*.

[Route] definisce il modello di routing [controller]. Il nome del controller (senza distinzione tra maiuscole e minuscole, senza il suffisso Controller) sostituisce il token [controller]. Questo controller gestisce le richieste a https://localhost:{PORT}/weatherforecast.

Nota

La route può contenere stringhe statiche, come in api/[controller]. In questo esempio questo controller gestirà una richiesta a https://localhost:{PORT}/api/weatherforecast.

Fornire i risultati meteo con il metodo Get()

WeatherForecastController include una singola azione del controller, designata dall'attributo [HttpGet(Name = "GetWeatherForecast")]. Questo attributo indirizza le richieste HTTP GET al metodo public IEnumerable<WeatherForecast> Get(). Come si è visto nell'esercizio precedente, le richieste a https://localhost:{PORT}/weatherforecast hanno causato la restituzione dei risultati meteo.

Come si apprenderà successivamente in questo modulo, altre azioni comuni sono associate a un'API Web che esegue operazioni CRUD (GET, PUT, POST, DELETE). Tuttavia, un controller API deve implementare una sola azione del controller.

In questo caso viene restituito l'elenco completo di WeatherForecast. L'operazione GET consente anche di recuperare un singolo elemento passando un identificatore. In ASP.NET è possibile recuperare un singolo elemento usando l'attributo [HttpGet("{id}")]. Si procederà all'implementazione di questo attributo nell'esercizio successivo.

Dopo aver appreso i componenti fondamentali di un controller per API Web, si è pronti per creare una classe PizzaController personalizzata.

Verificare le conoscenze

1.

Qual è lo scopo dell'attributo [ApiController]?