2024年12月31日 星期二

在 .NET9 Web API 專案使用 Scalar 測試 API

在 .NET9 Web API 專案使用 Scalar 測試 API

在 .NET 9 中,微軟已移除內建的 Swagger(Swashbuckle)支援,轉而推薦使用 Scalar 作為替代方案。 Scalar 是一個開源的 API 平台,提供現代化的 REST API 客戶端、精美的 API 文件,以及一流的 OpenAPI/Swagger 支援,適用於多種程式語言和平台。

在這篇文章中,我們將會透過 Curl 來測試 .NET9 Web API 專案,請依照底下的操作,建立起這篇文章需要用到的練習專案

建立測試專案

請依照底下的操作,建立起這篇文章需要用到的練習專案

  • 打開 Visual Studio 2022 IDE 應用程式
  • 從 [Visual Studio 2022] 對話窗中,點選右下方的 [建立新的專案] 按鈕
  • 在 [建立新專案] 對話窗右半部
    • 切換 [所有語言 (L)] 下拉選單控制項為 [C#]
    • 切換 [所有專案類型 (T)] 下拉選單控制項為 [Web API]
  • 在中間的專案範本清單中,找到並且點選 [ASP.NET Core Web API] 專案範本選項

    此專案範本可用於 ASP.NET Core 控制器或最小 API 建立 RESTful Web API,並可選擇性支援 OpenAPI 和驗證

  • 點選右下角的 [下一步] 按鈕
  • 在 [設定新的專案] 對話窗
  • 找到 [專案名稱] 欄位,輸入 csOpenApiScalar 作為專案名稱
  • 在剛剛輸入的 [專案名稱] 欄位下方,確認沒有勾選 [將解決方案與專案至於相同目錄中] 這個檢查盒控制項
  • 點選右下角的 [下一步] 按鈕
  • 現在將會看到 [其他資訊] 對話窗
  • 在 [架構] 欄位中,請選擇最新的開發框架,這裡選擇的 [架構] 是 : .NET 9.0 (標準字詞支援)
  • 在 [驗證類型] 選擇無
  • 在這個練習中,需要去勾選 [不要使用最上層陳述式(T)] 這個檢查盒控制項

    這裡的這個操作,可以由讀者自行決定是否要勾選這個檢查盒控制項

  • 請點選右下角的 [建立] 按鈕

稍微等候一下,這個專案將會建立完成

安裝要用到的 NuGet 開發套件

因為開發此專案時會用到這些 NuGet 套件,請依照底下說明,將需要用到的 NuGet 套件安裝起來。

安裝 Scalar.AspNetCore 套件

請依照底下說明操作步驟,將這個套件安裝到專案內

  • 滑鼠右擊 [方案總管] 視窗內的 [專案節點] 下方的 [相依性] 節點
  • 從彈出功能表清單中,點選 [管理 NuGet 套件] 這個功能選項清單
  • 此時,將會看到 [NuGet: csOpenApiScalar] 視窗
  • 切換此視窗的標籤頁次到名稱為 [瀏覽] 這個標籤頁次
  • 在左上方找到一個搜尋文字輸入盒,在此輸入 Scalar.AspNetCore
  • 在視窗右方,將會看到該套件詳細說明的內容,其中,右上方有的 [安裝] 按鈕
  • 點選這個 [安裝] 按鈕,將這個套件安裝到專案內

修改 Program.cs 類別內容

  • 找到並且打開 [Program.cs] 這個檔案
  • 找到 [app.MapOpenApi();] 這行程式碼,在其下方加入底下的程式碼
app.MapScalarApiReference(); // 預設路徑為 /scalar/v1
  • 底下是完成後的程式碼
namespace csOpenApiScalar
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var builder = WebApplication.CreateBuilder(args);

            // Add services to the container.

            builder.Services.AddControllers();
            // Learn more about configuring OpenAPI at https://aka.ms/aspnet/openapi
            builder.Services.AddOpenApi();

            var app = builder.Build();

            // Configure the HTTP request pipeline.
            if (app.Environment.IsDevelopment())
            {
                app.MapOpenApi();
                app.MapScalarApiReference(); // 預設路徑為 /scalar/v1
            }

            app.UseHttpsRedirection();

            app.UseAuthorization();


            app.MapControllers();

            app.Run();
        }
    }
}

啟動並執行這個專案

  • 在 Visual Studio 2022 IDE 中,按下 F5 鍵,或者是在功能表中選擇 [除錯] -> [開始偵錯],來執行這個程式

當專案啟動之後,並沒有看到任何瀏覽器出現

開啟瀏覽器,輸入 https://localhost:7124/scalar/v1 這個網址,將會看到底下的畫面

 




在 .NET9 Web API 專案使用 Curl 測試 API

在 .NET9 Web API 專案使用 Curl 測試 API

Curl 是什麼?

Curl(全名為「Client URL」)是一個在指令列(command line)中使用的工具,可用於向指定的 URL 傳送或取得資料。它支援多種協定(如 HTTP、HTTPS、FTP、SFTP 等),常被用來進行 API 測試、下載檔案或進行資料傳輸等工作。在撰寫自動化腳本或測試程式時,Curl 也是非常常見且實用的工具。

在這篇文章中,我們將會透過 Curl 來測試 .NET9 Web API 專案,請依照底下的操作,建立起這篇文章需要用到的練習專案

建立測試專案

請依照底下的操作,建立起這篇文章需要用到的練習專案

  • 打開 Visual Studio 2022 IDE 應用程式
  • 從 [Visual Studio 2022] 對話窗中,點選右下方的 [建立新的專案] 按鈕
  • 在 [建立新專案] 對話窗右半部
    • 切換 [所有語言 (L)] 下拉選單控制項為 [C#]
    • 切換 [所有專案類型 (T)] 下拉選單控制項為 [Web API]
  • 在中間的專案範本清單中,找到並且點選 [ASP.NET Core Web API] 專案範本選項

    此專案範本可用於 ASP.NET Core 控制器或最小 API 建立 RESTful Web API,並可選擇性支援 OpenAPI 和驗證

  • 點選右下角的 [下一步] 按鈕
  • 在 [設定新的專案] 對話窗
  • 找到 [專案名稱] 欄位,輸入 csNET9OpenAPI 作為專案名稱
  • 在剛剛輸入的 [專案名稱] 欄位下方,確認沒有勾選 [將解決方案與專案至於相同目錄中] 這個檢查盒控制項
  • 點選右下角的 [下一步] 按鈕
  • 現在將會看到 [其他資訊] 對話窗
  • 在 [架構] 欄位中,請選擇最新的開發框架,這裡選擇的 [架構] 是 : .NET 9.0 (標準字詞支援)
  • 在 [驗證類型] 選擇無
  • 在這個練習中,需要去勾選 [不要使用最上層陳述式(T)] 這個檢查盒控制項

    這裡的這個操作,可以由讀者自行決定是否要勾選這個檢查盒控制項

  • 請點選右下角的 [建立] 按鈕

稍微等候一下,這個專案將會建立完成

下載 Curl 工具

  • 打開瀏覽器,前往 Curl 官方網站
  • 點擊 [Curl for 64-bit] 
  • 打開這個下載的壓縮檔案
  • 找到 [curl-8.11.1_2-win64-mingw.zip\curl-8.11.1_2-win64-mingw\bin] 資料夾
  • 將這個資料夾中的 curl.exe 檔案複製到 C:\Windows\System32 資料夾中

啟動並執行這個專案

  • 在 Visual Studio 2022 IDE 中,按下 F5 鍵,或者是在功能表中選擇 [除錯] -> [開始偵錯],來執行這個程式

當專案啟動之後,並沒有看到任何瀏覽器出現

開啟 [命令提示字元] 視窗,輸入底下的指令,來測試這個 API

curl https://localhost:5001/weatherforecast

這個指令將會向 https://localhost:5001/weatherforecast 這個 URL 發送一個 GET 請求,並且取得回應結果

這樣就完成了透過 Curl 工具來測試 .NET9 Web API 專案的操作 




在 .NET9 Web API 專案使用 OpenAPI

在 .NET9 Web API 專案使用 OpenAPI

雖然 NSwag 和 Swashbuckle 多年來都為社區提供了良好的服務,但最近這兩個庫的維護和更新都出現了下降。這導致每個新版本在這些庫中利用和/或支援框架新功能的能力出現滯後。

雖然 Swashbuckle 在 2024 年隨著該項目新維護者的宣布而有所復興,並且現在對 .NET 8 擁有一流的支持,但它仍然是一個開源項目,免費提供並由志工在業餘時間維護。由於這些限制,每年發布新的主要版本很難跟上 .NET 生態系統的變化步伐。相比之下,Microsoft 的 ASP.NET 團隊全職從事該框架的工作,因此可以投入時間來確保他們提供的庫隨著產品的發展而保持最新的功能和最佳實踐隨著時間的推移。

從高層次來看,新的 Microsoft.AspNetCore.OpenApi 套件具有與 NSwag 和 Swashbuckle 相同的基本功能。它在運行時為 ASP.NET Core 端點產生 OpenAPI 文件。端點的形狀,例如它們的方法、路徑、請求、回應、參數等都源自於應用程式的程式碼。

建立測試專案

請依照底下的操作,建立起這篇文章需要用到的練習專案

  • 打開 Visual Studio 2022 IDE 應用程式
  • 從 [Visual Studio 2022] 對話窗中,點選右下方的 [建立新的專案] 按鈕
  • 在 [建立新專案] 對話窗右半部
    • 切換 [所有語言 (L)] 下拉選單控制項為 [C#]
    • 切換 [所有專案類型 (T)] 下拉選單控制項為 [Web API]
  • 在中間的專案範本清單中,找到並且點選 [ASP.NET Core Web API] 專案範本選項

    此專案範本可用於 ASP.NET Core 控制器或最小 API 建立 RESTful Web API,並可選擇性支援 OpenAPI 和驗證

  • 點選右下角的 [下一步] 按鈕
  • 在 [設定新的專案] 對話窗
  • 找到 [專案名稱] 欄位,輸入 csNET9OpenAPI 作為專案名稱
  • 在剛剛輸入的 [專案名稱] 欄位下方,確認沒有勾選 [將解決方案與專案至於相同目錄中] 這個檢查盒控制項
  • 點選右下角的 [下一步] 按鈕
  • 現在將會看到 [其他資訊] 對話窗
  • 在 [架構] 欄位中,請選擇最新的開發框架,這裡選擇的 [架構] 是 : .NET 9.0 (標準字詞支援)
  • 在 [驗證類型] 選擇無
  • 在這個練習中,需要去勾選 [不要使用最上層陳述式(T)] 這個檢查盒控制項

    這裡的這個操作,可以由讀者自行決定是否要勾選這個檢查盒控制項

  • 請點選右下角的 [建立] 按鈕

稍微等候一下,這個專案將會建立完成

了解 OpenAPI 的設定

在 .NET8,將會 [Swashbuckle.AspNetCore] 套件來支援 OpenAPI 的功能

  <ItemGroup>
    <PackageReference Include="Swashbuckle.AspNetCore" Version="6.6.2" />
  </ItemGroup>

但是在 .NET9,將會使用 [Microsoft.AspNetCore.OpenApi] 套件來支援 OpenAPI 的功能

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="9.0.0" />
  </ItemGroup>

現在找到並且打開 [Program.cs] 檔案,將會看到如下程式碼

namespace csNET9OpenAPI
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var builder = WebApplication.CreateBuilder(args);

            // Add services to the container.

            builder.Services.AddControllers();
            // Learn more about configuring OpenAPI at https://aka.ms/aspnet/openapi
            builder.Services.AddOpenApi();

            var app = builder.Build();

            // Configure the HTTP request pipeline.
            if (app.Environment.IsDevelopment())
            {
                app.MapOpenApi();
            }

            app.UseHttpsRedirection();

            app.UseAuthorization();


            app.MapControllers();

            app.Run();
        }
    }
}

在這個程式碼中,我們可以看到 builder.Services.AddOpenApi(); 這行程式碼,這行程式碼是用來註冊 OpenAPI 服務到 DI 容器中

而在 if (app.Environment.IsDevelopment()) 這個條件式中,我們可以看到 app.MapOpenApi(); 這行程式碼,這行程式碼是用來註冊 OpenAPI 中介軟體到 Middleware 管道中

現在來看看 OpenAPI 這個套件的表現

啟動並執行這個專案

  • 在 Visual Studio 2022 IDE 中,按下 F5 鍵,或者是在功能表中選擇 [除錯] -> [開始偵錯],來執行這個程式

當專案啟動之後,並沒有看到任何瀏覽器出現

現在打開瀏覽器,對於這個專案,需要輸入 https://localhost:7287/openapi/v1.json 這個服務端點,按下 Enter 鍵

這個服務端點將會回應一個 JSON 格式的 OpenAPI 文件,這個文件將會描述這個 Web API 的端點、方法、請求、回應等等,如下圖所示

  • 開啟瀏覽器,輸入這個服務端點 https://localhost:7180/WeatherForecast/,按下 Enter 鍵

  • 將會看到一個正常回應的 API 的回傳結果

修正專案啟動後,自動啟動 OpenAPI 文件

  • 在專案的根目錄中,找到並且打開 [Properties/launchSettings.json] 檔案
  • 這是現在的檔案內容
{
  "$schema": "https://json.schemastore.org/launchsettings.json",
  "profiles": {
    "http": {
      "commandName": "Project",
      "dotnetRunMessages": true,
      "launchBrowser": false,
      "applicationUrl": "http://localhost:5041",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "https": {
      "commandName": "Project",
      "dotnetRunMessages": true,
      "launchBrowser": false,
      "applicationUrl": "https://localhost:7287;http://localhost:5041",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}
  • 找到 "https" 這個 profile,並且將 launchBrowser 這個屬性的值改為 true,並且加入 launchUrl 這個屬性,這個屬性的值為 https://localhost:7287/openapi/v1.json
{
  "$schema": "https://json.schemastore.org/launchsettings.json",
  "profiles": {
    "http": {
      "commandName": "Project",
      "dotnetRunMessages": true,
      "launchBrowser": false,
      "applicationUrl": "http://localhost:5041",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    "https": {
      "commandName": "Project",
      "dotnetRunMessages": true,
      "launchBrowser": true,
      "launchUrl": "https://localhost:7287/openapi/v1.json",
      "applicationUrl": "https://localhost:7287;http://localhost:5041",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    }
  }
}
  • 重新啟動這個專案
  • 現在將會看到瀏覽器自動開啟 OpenAPI 文件