传统路由
传统路由建立的URL路径约定:{controller=Home}/{action=index}/{id?}
调用方式:/api/test2/ListProducts
Rest Api的属性路由
属性路由使用一组属性将操作直接映射到路由模板。下面是StartUp.Configure是Rest Api的典型代码
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
在MapControllers调用,UseEndpoints以映射属性路由控制器
路由模板
.net core 有以下路由模板
1.所有http谓词模板都是路由模板
2.路由
HTTP谓词模板
HttpGet、HttpPost、HttpDelete、HttpPut、[HttpHead]、[HttpPatch]
具有HTTP谓词特性的属性路由
每个操作包含[HttpGet]特性,每个请求方式却不同,详情见代码内注释。
[Route("api/[controller]")]
[ApiController]
public class Test2Controller : ControllerBase
{
[HttpGet] // GET /api/test2
public IActionResult ListProducts()
{
return ControllerContext.MyDisplayRouteInfo();
}
[HttpGet("{id}")] // GET /api/test2/xyz
public IActionResult GetProduct(string id)
{
return ControllerContext.MyDisplayRouteInfo(id);
}
[HttpGet("int/{id:int}")] // GET /api/test2/int/3
public IActionResult GetIntProduct(int id)
{
return ControllerContext.MyDisplayRouteInfo(id);
}
[HttpGet("int2/{id}")] // GET /api/test2/int2/3
public IActionResult GetInt2Product(int id)
{
return ControllerContext.MyDisplayRouteInfo(id);
}
}
Rest Api应使用属性路由将应用功能建模为一组资源,其中的操作由HTTP谓词表示。这意味着,多个操作(例如,同个逻辑资源的Get和POST)使用相同的URL。代码如下:
[ApiController]
public class MyProductsController : ControllerBase
{
[HttpGet("/products3")]
public IActionResult ListProducts()
{
return ControllerContext.MyDisplayRouteInfo();
}
[HttpPost("/products3")]
public IActionResult CreateProduct(MyProduct myProduct)
{
return ControllerContext.MyDisplayRouteInfo(myProduct.Name);
}
}
使用URL路径“/products3”
当Http谓词是HttpGet时,对应ListProducts
当Http谓词是HttpPost时,对应CreateProduct