創建API服務最小只要4行代碼!!!嘗新體驗ASP.NET Core 6預覽版本中的最小Web API(minimal APIS)新特性


本文首發於《創建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的其他功能和特性,敬請關注。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM