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

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

一、創建一個WebApi項目

我使用的是VS2022, .Net 7版本。
在創建界面有幾項配置:

  • 配置Https
  • 啓用Docker
  • 使用控制器
  • 啓用OpenAPI支持
  • 不使用頂級語句

image

其中配置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類是示例接口中有使用。

image

我們再對比一下 Program

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

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

image

按照以前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接口。
image

image

我們點擊示例接口WeatherForecast,訪問接口會返回json格式數據。響應的headers裏面可以看到後端運行的服務器是Kestrel,和我們以前.net framework不一樣的事需要藉助IIS作爲服務器。現在的Kestrel是包含在程序中的,這個Kestrel 以後再討論。
image

三、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重要知識。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章