.net 溫故知新【11】:Asp.Net Core WebAPI 入門使用及介紹

2023-06-04 18:01:08

在Asp.Net Core 上面由於現在前後端分離已經是趨勢,所以asp.net core MVC用的沒有那麼多,主要以WebApi作為學習目標。

一、建立一個WebApi專案

我使用的是VS2022, .Net 7版本。
在建立介面有幾項設定:

  • 設定Https
  • 啟用Docker
  • 使用控制器
  • 啟用OpenAPI支援
  • 不使用頂級語句

其中設定Https 是WebApi是否使用https協定,啟用docker是設定服務是否docker部署支援。我們這邊作為學習就先不管docker了。
然後下面還有三個設定,第一個是說是否使用控制器,如果使用介面服務放在Controllers資料夾下統一管理並且相關路由規則不一樣。
第二個啟用OpenAPI支援,如果啟用OpenAPI說的是swagger支援,也就是說.net 自動整合了swagger。
第三個不使用頂級語句,如果勾選後則程式的Program類和Main方法完整。

那麼我們看下上面設定是什麼意思,第二個swagger支援我們就不管了預設開啟。我建兩個專案AspNetCoreWebAPI_1、AspNetCoreWebAPI_2,AspNetCoreWebAPI_1我們勾選上【使用控制器】、【不使用頂級語句】。AspNetCoreWebAPI_2專案這兩項都不選。

先看下專案目錄結構

不同在於AspNetCoreWebAPI_1專案多了Controllers資料夾和一個WeatherForecast類,WeatherForecast類是範例介面中有使用。

我們再對比一下 Program

可以看到在AspNetCoreWebAPI_1專案中Program類和Main方法完整,因為要使用Controller的原因,所以依賴注入了Controller服務。並且使用了MapControllers註冊路由。

在AspNetCoreWebAPI_2專案中沒有隻有Main方法內的程式碼,這就是頂級語句。然後由於我們還使用了最小API,就是不使用Controller方式註冊和設定路由,直接在程式碼中自己註冊介面和實現介面處理的代理方法。

按照以前asp.net習慣和專案清晰度維護性我們一般是使用Controller的方式,並且不使用頂級語句。

而最小 API,是建立具有最小依賴項的 HTTP API。 它非常適合於需要在 ASP.NET Core 中僅包括最少檔案、功能和依賴項的微服務和應用。

另外還有一個appsetting.json組態檔,這部分內容也在前面已經介紹過,歡迎瞭解:.net 溫故知新:【8】.NET 中的設定從xml轉向json

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*"
}

二、WebApi執行

我們偵錯專案AspNetCoreWebAPI_1,此時會啟動一個服務在後端,同時啟動瀏覽器存取該站點的swagger,該swagger用於調我們偵錯webapi介面。

我們點選範例介面WeatherForecast,存取介面會返回json格式資料。響應的headers裡面可以看到後端執行的伺服器是Kestrel,和我們以前.net framework不一樣的事需要藉助IIS作為伺服器。現在的Kestrel是包含在程式中的,這個Kestrel 以後再討論。

三、WeatherForecastController

WeatherForecastController是在建立專案後預設生成的一個範例Controller。在該Controller中我們可以看到幾個重點項。

using Microsoft.AspNetCore.Mvc;

namespace AspNetCoreWebAPI_1.Controllers
{
    [ApiController]
    [Route("[controller]")]
    public class WeatherForecastController : ControllerBase
    {
        private static readonly string[] Summaries = new[]
        {
        "Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
    };

        private readonly ILogger<WeatherForecastController> _logger;

        public WeatherForecastController(ILogger<WeatherForecastController> logger)
        {
            _logger = logger;
        }

        [HttpGet(Name = "GetWeatherForecast")]
        public IEnumerable<WeatherForecast> Get()
        {
            return Enumerable.Range(1, 5).Select(index => new WeatherForecast
            {
                Date = DateOnly.FromDateTime(DateTime.Now.AddDays(index)),
                TemperatureC = Random.Shared.Next(-20, 55),
                Summary = Summaries[Random.Shared.Next(Summaries.Length)]
            })
            .ToArray();
        }
    }
}
  1. ControllerBase 基礎類別
    web API 控制器通常應派生自 ControllerBase 而不是 Controller。 Controller 派生自 ControllerBase,並新增對檢視的支援,因此它用於處理 Web 頁面,而不是 Web API 請求。 如果同一控制器必須支援檢視和 Web API,則派生自 Controller。
  2. [ApiController]
    [ApiController] 屬性可應用於控制器類,以啟用下述 API 特定的固定行為:
    1)屬性路由要求:不能通過由 UseEndpoints、UseMvc 或 UseMvcWithDefaultRoute 定義的傳統路由存取操作,傳統路由就是以前老的路由規則,型如"{controller=Home}/{action=Index}/{id?}"。需要使用[Route("XX")]指定路由。
    自動 HTTP 400 響應:[ApiController] 屬性使模型驗證錯誤自動觸發 HTTP 400 響應。
    2)繫結源引數推理:繫結源特性定義可找到操作引數值的位置,介面的引數通過推理規則應用於操作引數的預設資料來源。
    3)Multipart/form-data 請求推理:[ApiController] 屬性對 IFormFile 和 IFormFileCollection 型別的操作引數應用推理規則。 為這些型別推斷 multipart/form-data 請求內容型別。
    4)、錯誤狀態程式碼的問題詳細資訊: 將錯誤結果(狀態程式碼為 400 或更高的狀態碼)轉換為為 ProblemDetails 的結果。也就是說狀態碼會轉換如下json格式返回資訊。
{
  type: "https://tools.ietf.org/html/rfc7231#section-6.5.4",
  title: "Not Found",
  status: 404,
  traceId: "0HLHLV31KRN83:00000001"
}
  1. [Route("[controller]")]
    指定控制器上的屬性路由,屬性路由將應用的功能建模為一組資源,其中操作由 HTTP 謂詞表示。也就是說路由該屬性設定了路由,如上圖請求時的路由https://localhost:7122/WeatherForecast,設定中「[controller]」為標記替換,為方便起見,屬性路由支援標記替換,方法是將標記用方括號([、])括起來[controller]用於替換WeatherForecastController中WeatherForecast部分。
  2. [HttpGet(Name = "GetWeatherForecast")]
    HttpGet指示Get方法為Route路由的操作,即使我們將Get方法改為其他名字仍然不影響請求路由https://localhost:7122/WeatherForecast,並且以Get方式。這種api風格即為Rest風格。Rest風格我們後面再學習。
    ASP.NET Core 具有以下 HTTP 謂詞模板:
    • [HttpGet]
    • [HttpPost]
    • [HttpPut]
    • [HttpDelete]
    • [HttpHead]
    • [HttpPatch]
  3. logger紀錄檔記錄
    紀錄檔記錄是基礎知識點,這部分內容在我們之前溫故知新中已經詳細介紹過,可移步瞭解:.net 溫故知新:【9】.NET紀錄檔記錄 ILogger使用和原理

以上為我們入門WebApi建立的一個預設專案,並對建立選項、專案結構、服務要點進行了分析,後面將更進一步學習分享其他asp.net core webapi重要知識。