重新整理 .net core 實踐篇—————路由和終結點[二十三]

前言

簡單整理一下路由和終節點。

正文

路由方式主要有兩種:

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],如果沒有那麼可能是生成失敗了。

這裏顯示了404,那麼不應該是顯示400嗎? 如果是restful 風格來說,屬於路由約束,一切皆資源的角度上,這個資源不存在,是應該顯示404的。

下一節 簡單搭建一個基礎項目。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章