本文首發於《創建API服務最小只要4行代碼!!!嘗新體驗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的其他功能和特性,敬請關注。