.NET Core开发实战(第25课:路由与终结点:如何规划好你的Web API)--学习笔记(上)...
25 | 路由與終結(jié)點(diǎn):如何規(guī)劃好你的Web API
路由系統(tǒng)在 ASP.NET MVC 框架里面就已經(jīng)存在了,在 ASP.NET Core 框架里面進(jìn)行了改進(jìn)
路由系統(tǒng)的核心作用是指 URL 和 應(yīng)用程序 Controller 的對(duì)應(yīng)關(guān)系的一種映射
這個(gè)映射關(guān)系實(shí)際上有兩種作用:
1、把 URL 映射到對(duì)應(yīng)的 Controller 對(duì)應(yīng)的 action 上面去
2、根據(jù) Controller 和 action 的名字來(lái)生產(chǎn) URL
.NET Core 提供了兩種路由注冊(cè)的方式:
1、路由模板的方式
2、RouteAttribute 方式
這兩種方式分別適用于的場(chǎng)景是不一樣的
路由模板的方式是之前傳統(tǒng)的方式,可以用來(lái)作為 MVC 的頁(yè)面 Web 配置
現(xiàn)在用的比較多的前后端分離的架構(gòu),定義 Web API 的時(shí)候使用 RouteAttribute 方式去做
在定義路由,注冊(cè)路由的過(guò)程中間,有一個(gè)重要的特性就是路由約束,是指路由如何匹配
有以下簡(jiǎn)單的幾種約束:
1、類型約束
2、范圍約束
3、正則表達(dá)式
4、是否必選
5、自定義 IRouteConstraint
另外路由系統(tǒng)提供了兩個(gè)關(guān)鍵的類,用來(lái)反向根據(jù)路由的信息生產(chǎn) URL 地址
1、LinkGenerator
2、IUrlHelper
IUrlHelper 與 MVC 框架里面的 MVCHelper 很像
而 LinkGenerator 是全新提供的一個(gè)鏈接生成的對(duì)象,可以從容器里面,在任意的位置都可以獲取到這個(gè)對(duì)象,然后根據(jù)需要生成 URL 地址
接下來(lái)看一下代碼
源碼鏈接:
https://github.com/witskeeper/geektime/tree/master/samples/RoutingDemo
為了方便演示,這里先注冊(cè)了一組 Swagger 的代碼,將 Web API 通過(guò) Swagger 的可視化界面輸出出來(lái)
引入 Swagger 對(duì)應(yīng) 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); });在中間件里面注冊(cè) 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">必須可以轉(zhuǎn)為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">以三個(gè)數(shù)字開始</param>/// <returns></returns>[HttpGet("{number:regex(^\\d{{3}}$)}")]// 正則表達(dá)式約束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;}} }注冊(cè) MyRouteConstraint
services.AddRouting(options => {options.ConstraintMap.Add("MyRouteConstraint", typeof(MyRouteConstraint)); });讓它生效之前,需要在中間件注冊(cè)的位置注入 UseEndpoints,然后對(duì) UseEndpoints 使用 MapControllers
app.UseEndpoints(endpoints => {// 使用 RouteAttributeendpoints.MapControllers(); });通過(guò)這樣子的方式把 OrderController 的路由注入進(jìn)來(lái)
啟動(dòng)程序,可以看到一共有五個(gè)接口
第一個(gè)接口是我們實(shí)現(xiàn)的自定義約束,點(diǎn)擊 try it out 后輸入?yún)?shù)
第二個(gè)接口約束最大為20
輸入5,執(zhí)行
可以看到響應(yīng)碼是 200
輸入25,執(zhí)行
可以看到響應(yīng)碼是 404,也就說(shuō)路由匹配失敗了
第三個(gè)接口因?yàn)閰?shù)是必須的,所以沒(méi)辦法輸入空值,有一個(gè)前端的驗(yàn)證
第四個(gè)接口以三個(gè)數(shù)字開始,輸入 234,符合正則表達(dá)式,響應(yīng)碼 200
總結(jié)
以上是生活随笔為你收集整理的.NET Core开发实战(第25课:路由与终结点:如何规划好你的Web API)--学习笔记(上)...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 浅谈 Kubernetes Schedu
- 下一篇: asp.net ajax控件工具集 Au