前言
簡單整理一下路由和終節點。
正文
路由方式主要有兩種:
1.路由模闆方式
2.RouteAttribute 方式
路由限制:
1.類型限制
2.範圍限制
3.正規表達式
4.是否必選
5.自定義 IRootConstaint
URL 生成
1.LinKGenerator
2.IUrlHelper
先搭建一個swagger:
services.AddSwaggerGen(c =>
{
c.SwaggerDoc("v1", new OpenApiInfo {Title = "API", Version = "v1"});
var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
var xmlPath = Path.Combine(AppContext.BaseDirectory,xmlFile);
c.IncludeXmlComments(xmlPath);
});
app.UseSwagger();
app.UseSwaggerUI(c =>
{
c.SwaggerEndpoint("/swagger/v1/swagger.json","My Api V1");
});
然後建立一個controller:
[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;
}
}
看到在每個action上都有一些配置,上面就是限制。
上面這種屬于RouteAttribute,故而應該設定:
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
有了這些限制呢,我們的代碼将會更加的整潔。因為我們每次擷取參數的時候都應該判斷是否符合規格,不符合傳回404。有了這些配置我們少寫很多重複性代碼。
上面看到,自定義了MyRouteConstraint 限制。
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;
}
}
然後在路由中加入:
services.AddRouting(options =>
{
options.ConstraintMap.Add("MyRouteConstraint", typeof(MyRouteConstraint));
});
如果顯示xml找不到,加上。
<GenerateDocumentationFile>true</GenerateDocumentationFile>
如果是顯示:undefined /swagger/V1/swagger.json
一般來說,我們寫過一些代碼後,應該不會出現什麼配置錯誤。
因為swagger要求比較嚴格,檢視一下,自己寫的action,上有沒有标注[httpget]或者[httppost],如果沒有那麼可能是生成失敗了。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiETPwJWZ3ZCMwcTP39zZuBnLuVzRjVXWE9EeRR0TxUkeOBDMD1UeJpXTw0kaNhXRE5EeZRUT4lERNlHMD5UNjR1T0kEVNZXWE1EeJRUT5hzQOVzYU9ENJRVT2NmMiNnSywEd5ITW110MaZHetlVdO1GT3lERNl3YXJGc5kHT20ESjBjUIF2Lc12bj5SYphXa5VWen5WY35iclN3Ztl2Lc9CX6MHc0RHaiojIsJye.png)
這裡顯示了404,那麼不應該是顯示400嗎? 如果是restful 風格來說,屬于路由限制,一切皆資源的角度上,這個資源不存在,是應該顯示404的。
結
下一節 簡單搭建一個基礎項目。