iT邦幫忙

2024 iThome 鐵人賽

DAY 19
0

分享主軸

  • 什麼是路由?
  • 基本路由原理與設置
  • 自訂義路由
  • 路由約束與屬性路由

路由是什麼

路由(Routing)在 Web 應用中是一種用來處理 URL 請求的機制
其主要作用是將 URL 映射到應用中的特定資源,如控制器、方法或頁面

小提醒 : 從 .NET 6 開始,應用程式不需要特別呼叫 app.UseRouting() 與 app.UseEndpoints(),而是會由 app.MapControllers() 此中介內部去執行原本兩個中介

以往的路由舉例 ( ASP .NET Core 3 )

app.UseRouting(); 

app.UseEndpoints(endpoints =>
{
    endpoints.MapControllers(); 
});

會看到以往需要依賴 app.UseRouting() 與 app.UseEndpoints() 的 Middleware 去執行應用程式路由規範
簡單講解一下意思,如下說明

  • app.UseRouting() : 是把應用程式內的 Url 匹配到這個中介,以及根據請求選擇最合適的端點去做匹配 => 個人認為可以想成 匹配終端

  • app.UseEndpoints() : 將匹配到的終端加入此中介 ,並執行與此匹配到的端點的關聯委派 (這個委派包含了處理請求的具體邏輯) => 個人認為可以想成 執行終端

路由原理與設置

再來舉例 ASP .NET Core 8

附上參考網址 : https://learn.microsoft.com/en-us/aspnet/core/fundamentals/routing?view=aspnetcore-6.0#routing-basics-1

以 ASP .NET Core 8 為例,路由設定在 program.cs 內,如下新建好的專案範本

1. MVC

  • 預設創好的專案
app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}"); //配置默認路由
  • MVC 多個路由設定範例
app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.MapControllerRoute(
    name: "custom1",
    pattern: "custom1/{*custom1}",
    defaults: new { controller = "Home", action = "Custom1" });

app.MapControllerRoute(
    name: "custom2",
    pattern: "custom2/{*custom2}",
    defaults: new { controller = "Home", action = "Custom2" });

Controller

 public class HomeController : Controller
    {
        public IActionResult Index()
        {
            return Content("Default Route");
        }

        public IActionResult Custom1()
        {
            return Content("Custom Route 1");
        }

        public IActionResult Custom2()
        {
            return Content("Custom Route 2");
        }
    }

如下效果
https://ithelp.ithome.com.tw/upload/images/20241002/20133954zXjY78pUeF.png

https://ithelp.ithome.com.tw/upload/images/20241002/201339545JtHgEaPcw.png

https://ithelp.ithome.com.tw/upload/images/20241002/20133954abTLJRMr5N.png

2. WEB API

  • 預設創好的專案
app.MapControllers() //配置控制器路由

屬性路由(Attribute Routing)與約束

參考文章 : https://learn.microsoft.com/zh-cn/aspnet/web-api/overview/web-api-routing-and-actions/attribute-routing-in-web-api-2

  • 屬性路由
  1. 允許開發者直接在控制器和動作方法上使用屬性來指定路由規則
    [Route("[...]")] 可以自訂 Url 路徑
    [ApiController]
    [Route("[api/[controller]]")]
    public class ProductsController : ControllerBase
    {
        ...
    }
  1. 在Action方法上,搭配動詞去設定路由
[HttpGet("{id}")]
[HttpPost("")]
[HttpDelete("{id}")]
[HttpPut("{id}")]
[HttpPatch("{id}")]
  • 路由約束
  1. ASP .NET Core 內提供一些,例如下方
{param:int}:參數必須是整數
{param:bool}:參數必須是布爾值
{param:datetime}:參數必須是日期時間
{param:decimal}:參數必須是十進制數
{param:double}:參數必須是雙精度浮點數
{param:float}:參數必須是單精度浮點數
{param:guid}:參數必須是 GUID
{param:length(5)}:參數的長度必須是 5
{param:minlength(3)}:參數的最小長度必須是 3
{param:maxlength(10)}:參數的最大長度必須是 10
{param:range(1,100)}:參數的值必須在 1 到 100 之間

舉例

  • GetById 方法使用了 {id:int} 約束,確保 id 參數必須是整數
  • GetByCategory 方法使用了 {name:length(3,20)} 約束,確保 name 參數的長度在 3 到 20 之間
  • GetByRange 方法使用了 {min:int} 和 {max:int} 約束,確保 min 和 max 參數必須是整數
    [ApiController]
    [Route("api/[controller]")]
    public class ProductsController : ControllerBase
    {
        // GET: api/products/5
        [HttpGet("{id:int}")]
        public string GetById(int id)
        {
            ...
        }

        // GET: api/products/category/electronics
        [HttpGet("category/{name:length(3,20)}")]
        public string GetByCategory(string name)
        {
            ...
        }

        // GET: api/products/range/1/100
        [HttpGet("range/{min:int}/{max:int}")]
        public string GetByRange(int min, int max)
        {
            ...
        }
    }

今日結語
路由說起來也確實很重要,了解它更可以掌握整個 ASP .NET Core 設定,就像是今天要去某個地方,需要導航導引路,路由也正是 ASP .NET Core 內的 URL 配置設定!

希望有幫助到大家,明天繼續努力 ~

參考網址
https://learn.microsoft.com/en-us/aspnet/core/mvc/controllers/routing?view=aspnetcore-8.0


上一篇
Day 18 JWT:ASP.NET Core 驗證機制之一
下一篇
Day 20 Model Binding : 模型繫結
系列文
靠近 ASP .NET Core 一點點27
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言