.NET Core开发实战(第25课:路由与终结点:如何规划好你的Web API)--学习笔记(上)...
25 | 路由與終結點:如何規劃好你的Web API
路由系統在 ASP.NET MVC 框架里面就已經存在了,在 ASP.NET Core 框架里面進行了改進
路由系統的核心作用是指 URL 和 應用程序 Controller 的對應關系的一種映射
這個映射關系實際上有兩種作用:
1、把 URL 映射到對應的 Controller 對應的 action 上面去
2、根據 Controller 和 action 的名字來生產 URL
.NET Core 提供了兩種路由注冊的方式:
1、路由模板的方式
2、RouteAttribute 方式
這兩種方式分別適用于的場景是不一樣的
路由模板的方式是之前傳統的方式,可以用來作為 MVC 的頁面 Web 配置
現在用的比較多的前后端分離的架構,定義 Web API 的時候使用 RouteAttribute 方式去做
在定義路由,注冊路由的過程中間,有一個重要的特性就是路由約束,是指路由如何匹配
有以下簡單的幾種約束:
1、類型約束
2、范圍約束
3、正則表達式
4、是否必選
5、自定義 IRouteConstraint
另外路由系統提供了兩個關鍵的類,用來反向根據路由的信息生產 URL 地址
1、LinkGenerator
2、IUrlHelper
IUrlHelper 與 MVC 框架里面的 MVCHelper 很像
而 LinkGenerator 是全新提供的一個鏈接生成的對象,可以從容器里面,在任意的位置都可以獲取到這個對象,然后根據需要生成 URL 地址
接下來看一下代碼
源碼鏈接:
https://github.com/witskeeper/geektime/tree/master/samples/RoutingDemo
為了方便演示,這里先注冊了一組 Swagger 的代碼,將 Web API 通過 Swagger 的可視化界面輸出出來
引入 Swagger 對應 ASP.NET Core 的包
Swashbuckle.AspNetCore將代碼文檔 XML 文檔注入給 Swagger
services.AddSwaggerGen(c => {c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" });var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);c.IncludeXmlComments(xmlPath); });在中間件里面注冊 Swagger
app.UseSwagger(); app.UseSwaggerUI(c => {c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1"); });這樣子就可以在界面上看到 Swagger 的界面,并且瀏覽我們定義的 API
接著是路由的定義 OrderController
namespace RoutingDemo.Controllers {[Route("api/[controller]/[action]")]// RouteAttribute 的方式[ApiController]public class OrderController : ControllerBase{/// <summary>/// /// </summary>/// <param name="id">必須可以轉為long</param>/// <returns></returns>[HttpGet("{id:MyRouteConstraint}")]// 這里使用了自定義的約束public bool OrderExist(object id){return true;}/// <summary>/// /// </summary>/// <param name="id">最大20</param>/// <returns></returns>[HttpGet("{id:max(20)}")]// 這里使用了 Max 的約束public bool Max(long id){return true;}/// <summary>/// /// </summary>/// <param name="ss">必填</param>/// <returns></returns>[HttpGet("{name:required}")]// 必填約束public bool Reque(string name){return true;}/// <summary>/// /// </summary>/// <param name="number">以三個數字開始</param>/// <returns></returns>[HttpGet("{number:regex(^\\d{{3}}$)}")]// 正則表達式約束public bool Number(string number){return true;}} }上面用到了自定義約束 MyRouteConstraint
namespace RoutingDemo.Constraints {public class MyRouteConstraint : IRouteConstraint{public bool Match(HttpContext httpContext, IRouter route, string routeKey, RouteValueDictionary values, RouteDirection routeDirection){if (RouteDirection.IncomingRequest == routeDirection){var v = values[routeKey];if (long.TryParse(v.ToString(), out var value)){return true;}}return false;}} }注冊 MyRouteConstraint
services.AddRouting(options => {options.ConstraintMap.Add("MyRouteConstraint", typeof(MyRouteConstraint)); });讓它生效之前,需要在中間件注冊的位置注入 UseEndpoints,然后對 UseEndpoints 使用 MapControllers
app.UseEndpoints(endpoints => {// 使用 RouteAttributeendpoints.MapControllers(); });通過這樣子的方式把 OrderController 的路由注入進來
啟動程序,可以看到一共有五個接口
第一個接口是我們實現的自定義約束,點擊 try it out 后輸入參數
第二個接口約束最大為20
輸入5,執行
可以看到響應碼是 200
輸入25,執行
可以看到響應碼是 404,也就說路由匹配失敗了
第三個接口因為參數是必須的,所以沒辦法輸入空值,有一個前端的驗證
第四個接口以三個數字開始,輸入 234,符合正則表達式,響應碼 200
總結
以上是生活随笔為你收集整理的.NET Core开发实战(第25课:路由与终结点:如何规划好你的Web API)--学习笔记(上)...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浅谈 Kubernetes Schedu
- 下一篇: Angular SPA基于Ocelot