前言
简单整理一下路由和终节点。
正文
路由方式主要有两种:
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的。
结
下一节 简单搭建一个基础项目。