本文首發於《嘗新體驗ASP.NET Core 6預覽版本中釋出的最小Web API(minimal APIS)新特性》
概述
.NET開發者們大家好,我是Rector。
幾天前(美國時間2021年8月10日),微軟官方釋出了.NET 6的第7個預覽版,其中包含了很多新的特性和功能,比如:
- 優化最小Web API(minimal APIS)模板
- 為生成常用HTTP響應添加了IResult的介面實現
- 最小操作支援Request,Response等
- 優化了最小主機、模板
- 從查詢字串中獲取Blazor元件引數
- ...
本文我們主要來體驗最小Web API的功能和特性。最小Web API的目的主要是幫助C#(或者F#)後端開發者快速建立微服務專案或者HTTP API服務。
與之前的ASP.NET Core Web API相比,最小Web API在啟動模板和框架結構上都有些不同。最小Web API的模板相當簡潔,你幾需要寫4行程式碼便可完成一個最小Web API專案的搭建。
下面我們從頭開始建立一個最小Web API專案並體驗。
準備工作
在開始建立最小Web API之前,請確保開發環境中已安裝了.NET SDK 6.0.100-preview.7.21379.14(當前最新的.NET SDK版本),在Windows作業系統中,你可以使用.NET Cli命令來檢視,比如:
dotnet --info
執行結果如下圖:
如果需要檢視當前環境已安裝的.NET模板,執行如下命令:
dotnet new -l
執行結果如下:
Template Name Short Name Language Tags
-------------------------------------------- ------------------- ---------- --------------------------
ASP.NET Core Empty web [C#],F# Web/Empty
ASP.NET Core gRPC Service grpc [C#] Web/gRPC
ASP.NET Core Web API webapi [C#],F# Web/WebAPI
ASP.NET Core Web App razor,webapp [C#] Web/MVC/Razor Pages
ASP.NET Core Web App (Model-View-Controller) mvc [C#],F# Web/MVC
ASP.NET Core with Angular angular [C#] Web/MVC/SPA
ASP.NET Core with React.js react [C#] Web/MVC/SPA
ASP.NET Core with React.js and Redux reactredux [C#] Web/MVC/SPA
Blazor Server App blazorserver [C#] Web/Blazor
Blazor WebAssembly App blazorwasm [C#] Web/Blazor/WebAssembly/PWA
Class Library classlib [C#],F#,VB Common/Library
Console Application console [C#],F#,VB Common/Console
dotnet gitignore file gitignore Config
Dotnet local tool manifest file tool-manifest Config
global.json file globaljson Config
MSTest Test Project mstest [C#],F#,VB Test/MSTest
MVC ViewImports viewimports [C#] Web/ASP.NET
MVC ViewStart viewstart [C#] Web/ASP.NET
NuGet Config nugetconfig Config
NUnit 3 Test Item nunit-test [C#],F#,VB Test/NUnit
NUnit 3 Test Project nunit [C#],F#,VB Test/NUnit
Protocol Buffer File proto Web/gRPC
Razor Class Library razorclasslib [C#] Web/Razor/Library
Razor Component razorcomponent [C#] Web/ASP.NET
Razor Page page [C#] Web/ASP.NET
Solution File sln Solution
Web Config webconfig Config
Windows Forms App winforms [C#],VB Common/WinForms
Windows Forms Class Library winformslib [C#],VB Common/WinForms
Windows Forms Control Library winformscontrollib [C#],VB Common/WinForms
Worker Service worker [C#],F# Common/Worker/Web
WPF Application wpf [C#],VB Common/WPF
WPF Class library wpflib [C#],VB Common/WPF
WPF Custom Control Library wpfcustomcontrollib [C#],VB Common/WPF
WPF User Control Library wpfusercontrollib [C#],VB Common/WPF
xUnit Test Project xunit [C#],F#,VB Test/xUnit
建立最小API程式專案
在.NET Core中建立程式的方式有多種,可以使用命令列工具執行dotnet new <模板名稱> <專案名稱>
建立,也可以使用IDE(如:Visual Studio, Rider, VS Code)來建立。
使用命令列工具建立最小API專案
在本地磁碟建立一個儲存專案的目錄,假如路徑為D:\Project\tmp\MinimalApi
,開啟命令列工具並進入此目錄,在當前目錄下執行如下命令:
dotnet new web MinApi
執行結果如下圖
生成的專案資料夾和檔案如下圖
至此,以命令列方式建立最小API專案即完成。
使用Visual Studio建立最小API專案
使用Visual Studio建立最小API專案,請確保已安裝Visual Studio 2022 17.0.0 Preview 3.0(當前最新版本)。
依次開啟Visual Studio 2022的【Start Window】->【Create a new project】視窗,在右側的已安裝模板列表中選擇【ASP.NET Core Empty】專案模板,之後點選[Next]按鈕,如圖:
在彈出的【Configure your new project】中,完善Project name(專案名稱),Location(位置),Solution name(解決方案名稱)等資訊,然後點選[Next]按鈕,如圖:
在彈出的【Additional Information】視窗中,Framework的版本選擇[.NET 6.0(Preview)],然後點選[Next]按鈕,以完成最小API專案的建立,如圖:
最小API解析
在IDE中開啟剛才建立的MinimalApi,並在程式碼編輯器中開啟Program.cs
檔案,如下:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.MapGet("/", () => "Hello World!");
app.Run();
可以看到,最小API專案的程式碼非常簡潔,如果去掉其中的異常處理程式碼,就還剩4行程式碼了,如下:
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
app.Run();
為了不啟用https,我們修改一下位於Properties
目錄中的launchSettings.json
配置檔案,修改後如下:
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:2200",
"sslPort": 0
}
},
"profiles": {
"MinimalApi": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": true,
"applicationUrl": "http://localhost:2200",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}
然後啟用專案,看是否能正常執行起來。在Visual Studio 2022中,按F5執行,如果在瀏覽中開啟並顯示如下頁面,說明最小API專案執行正常,如圖:
在最小API專案中,直接呼叫WebApplication.MapGet()
方法即可完成路由的註冊和對映,如新增一個error
的路由:
app.MapGet("/error", () => Results.Problem("錯誤",statusCode:500));
執行結果如圖:
WebApplication
例項提供了很多路由對映的方法,比如HTTP請求協議:MapGet()
,MapPost()
,MapDelete()
,MapPut()
等等。
與以往的ASP.NET Core應用程式相同,在最小API專案中,你仍然可以使用像Swagger這樣的介面文件元件。
首先,在Nuget包管理工具中搜索Swashbuckle
,然後安裝Swashbuckle.AspNetCore
元件,如圖:
然後註冊Swagger的服務和路由,完整的示例如下:
using Microsoft.OpenApi.Models;
var builder = WebApplication.CreateBuilder(args);
/// <summary>
/// 新增Swagger
/// </summary>
builder.Services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "Api", Version = "v1" });
});
/// <summary>
/// 註冊API發現功能
/// </summary>
builder.Services.AddEndpointsApiExplorer();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.MapGet("/", () => "Hello World!");
/// <summary>
/// 丟擲異常測試
/// </summary>
app.MapGet("/throw", () => { throw new Exception("Exception occured"); });
/// <summary>
/// 錯誤頁面示例
/// </summary>
app.MapGet("/error", () => Results.Problem("錯誤",statusCode:500));
/// <summary>
/// 註冊Swagger的路由
/// </summary>
app.UseSwagger();
/// <summary>
/// 註冊Swagger UI的路由
/// </summary>
app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "Api v1"));
app.Run();
執行後的Swagger介面如圖:
在最小API應用程式中,我們同樣也可以返回實體物件,比如:註冊一個/customer
的路由,然後返回一個Customer
的例項模型,如下:
using Microsoft.OpenApi.Models;
var builder = WebApplication.CreateBuilder(args);
/// <summary>
/// 新增Swagger
/// </summary>
builder.Services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo { Title = "Api", Version = "v1" });
});
/// <summary>
/// 註冊API發現功能
/// </summary>
builder.Services.AddEndpointsApiExplorer();
var app = builder.Build();
if (app.Environment.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.MapGet("/", () => "Hello World!");
/// <summary>
/// 丟擲異常測試
/// </summary>
app.MapGet("/throw", () => { throw new Exception("Exception occured"); });
/// <summary>
/// 錯誤頁面示例
/// </summary>
app.MapGet("/error", () => Results.Problem("錯誤",statusCode:500));
/// <summary>
/// 返回客戶實體模型
/// </summary>
app.MapGet("/customer", () => new Customer("Rector", "Liu"));
/// <summary>
/// 註冊Swagger的路由
/// </summary>
app.UseSwagger();
/// <summary>
/// 註冊Swagger UI的路由
/// </summary>
app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "Api v1"));
app.Run();
/// <summary>
/// 客戶實體
/// </summary>
/// <param name="FirstName"></param>
/// <param name="LastName"></param>
public record Customer(string FirstName, string LastName);
執行結果如圖:
好了,本文對最小Web API的體驗到此。碼友網將在後續的文章中為大家分享的關於最小Web API的其他功能和特性,敬請關注。