日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

.NET Core开发实战(第25课:路由与终结点:如何规划好你的Web API)--学习笔记(上)...

發(fā)布時間:2023/12/4 42 豆豆
生活随笔 收集整理的這篇文章主要介紹了 .NET Core开发实战(第25课:路由与终结点:如何规划好你的Web API)--学习笔记(上)... 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

25 | 路由與終結(jié)點:如何規(guī)劃好你的Web API

路由系統(tǒng)在 ASP.NET MVC 框架里面就已經(jīng)存在了,在 ASP.NET Core 框架里面進(jìn)行了改進(jìn)

路由系統(tǒng)的核心作用是指 URL 和 應(yīng)用程序 Controller 的對應(yīng)關(guān)系的一種映射

這個映射關(guān)系實際上有兩種作用:

1、把 URL 映射到對應(yīng)的 Controller 對應(yīng)的 action 上面去

2、根據(jù) Controller 和 action 的名字來生產(chǎn) URL

.NET Core 提供了兩種路由注冊的方式:

1、路由模板的方式

2、RouteAttribute 方式

這兩種方式分別適用于的場景是不一樣的

路由模板的方式是之前傳統(tǒng)的方式,可以用來作為 MVC 的頁面 Web 配置

現(xiàn)在用的比較多的前后端分離的架構(gòu),定義 Web API 的時候使用 RouteAttribute 方式去做

在定義路由,注冊路由的過程中間,有一個重要的特性就是路由約束,是指路由如何匹配

有以下簡單的幾種約束:

1、類型約束

2、范圍約束

3、正則表達(dá)式

4、是否必選

5、自定義 IRouteConstraint

另外路由系統(tǒng)提供了兩個關(guān)鍵的類,用來反向根據(jù)路由的信息生產(chǎn) URL 地址

1、LinkGenerator

2、IUrlHelper

IUrlHelper 與 MVC 框架里面的 MVCHelper 很像

而 LinkGenerator 是全新提供的一個鏈接生成的對象,可以從容器里面,在任意的位置都可以獲取到這個對象,然后根據(jù)需要生成 URL 地址

接下來看一下代碼

源碼鏈接:
https://github.com/witskeeper/geektime/tree/master/samples/RoutingDemo

為了方便演示,這里先注冊了一組 Swagger 的代碼,將 Web API 通過 Swagger 的可視化界面輸出出來

引入 Swagger 對應(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); });

在中間件里面注冊 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">以三個數(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;}} }

注冊 MyRouteConstraint

services.AddRouting(options => {options.ConstraintMap.Add("MyRouteConstraint", typeof(MyRouteConstraint)); });

讓它生效之前,需要在中間件注冊的位置注入 UseEndpoints,然后對 UseEndpoints 使用 MapControllers

app.UseEndpoints(endpoints => {// 使用 RouteAttributeendpoints.MapControllers(); });

通過這樣子的方式把 OrderController 的路由注入進(jìn)來

啟動程序,可以看到一共有五個接口

第一個接口是我們實現(xiàn)的自定義約束,點擊 try it out 后輸入?yún)?shù)

第二個接口約束最大為20

輸入5,執(zhí)行

可以看到響應(yīng)碼是 200

輸入25,執(zhí)行

可以看到響應(yīng)碼是 404,也就說路由匹配失敗了

第三個接口因為參數(shù)是必須的,所以沒辦法輸入空值,有一個前端的驗證

第四個接口以三個數(shù)字開始,輸入 234,符合正則表達(dá)式,響應(yīng)碼 200

總結(jié)

以上是生活随笔為你收集整理的.NET Core开发实战(第25课:路由与终结点:如何规划好你的Web API)--学习笔记(上)...的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。