.NET 6 minimal web API è un nuovo modello per creare delle API molto veloci con poche righe di codice, avendo a disposizione tutta la potenza di .NET 6.
Verifica
Come prima cosa va verificato se è installato .NET 6
Il progetto può essere creato da linea di comando con dotnet new web ed editato con Visual Studio Code o direttamente in Visual Studio
DOS / Batch file
mkdir Sgart.Net.MinimalAPI
cd Sgart.Net.MinimalAPI
dotnet new web
code .
da come output
Text
Creazione del modello "ASP.NET Core Empty" completata.
Elaborazione post-creazione delle azioni in corso...
Esecuzione di 'dotnet restore ' in D:\PROJECTS\...\Sgart.Net.MinimalAPI\Sgart.Net.MinimalAPI.csproj...
Individuazione dei progetti da ripristinare...
D:\PROJECTS\...\Sgart.Net.MinimalAPI\Sgart.Net.MinimalAPI.csproj ripristinato (in 141 ms).
Il ripristino è riuscito.
Il parametro corretto per un progetto minimal web API è web e non webapi.
La struttura del progetto è questa:
Properties
launchSettings.json
appsettings.Development.json
appsettings.json
Program.cs
Sgart.Net.MinimalAPI.csproj
dove tutto il codice risiede in Program.cs e sono solo 4 linee
C#: Program.cs
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => "Sgart.it ciao");
app.Run();
Non esiste più il file Startup.cs
Esecuzione
lo si può eseguire con il comando
DOS / Batch file
dotnet watch
il parametro watch manda in esecuzione il codice, rimane in attesa di cambiamenti al sorgente e riavvia la compilazione
Una volta chiamata l'API, verrà visualizzata la scritta Sgart.it ciao.Root
Aggiunta API
Ovviamente si possono aggiungere altre API tramite il metodo MapGet, ad esempio per calcolare la radice quadrata di un numero
C#: Program.cs
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => "Sgart.it ciao");
app.MapGet("/sqrt/{num:int}", (int num) => Math.Sqrt(num));
app.Run();
MapPost => per inviare dei dati che creano una risorsa
MapPut => per inviare dei dati che modificano una risorsa
MapDelete => per rimuovere una rosorsa
Posso usare il metodo in POST per aggiungere una nuova API che moltiplica (/mult) 2 numeri:
C#: Program.cs
using Microsoft.AspNetCore.Mvc;
var builder = WebApplication.CreateBuilder(args);
...
app.MapPost("/mult", ([int num) => Math.Sqrt(num));
...
app.Run();
# record (C# 9) di supporto per i dati in ingresso
record MultInputDTO(int V1, int V2);
Attenzione se l'API aggiunta non viene trovata, nella console, dove è in esecuzione il comando dotnet watch, premere CTRL + R per riavviare.
Post
415 Unsupported Media Type se si ottiene questo messaggio vuol dire che nell'header della richiesta manca content-type: application/json
Json
Per impostazione predefinita la serializzazione degli oggetti è sempre e solo in JsoncamelCase
Ad esempio se aggiungo un metodo /tan che ritorna un oggetto
C#: Program.cs
...
app.MapGet("/tan/{num:int}", (int num) => new
{
result = Math.Tan(num)
});
...
il risultato è questoRisultato in JSON
NLog
Una delle funzionalità principali di un programma è la capacita di "loggare" le sua attività. Si tratta di una funzionalità indispensabile per fare debug in produzione in caso di problemi.
Tutti i siti, per questioni di sicurezza devono funzionare solo in https, quindi meglio forzare il redirect
C#: Program.cs
...
var app = builder.Build();
// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
// The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
app.UseHsts();
}
app.UseHttpsRedirection();
....
File statici
Se oltre all'API è richiesto il supporto di file statici quali, immagini CSS, JavaScript, ecc..., deve essere abilitato il supporto con UseStaticFiles