1.什么是路由?
1.路由是将传入http请求(URL)映射到特定资源的过程(a action method)。
2.我们可以使用唯一的URL访问任何的资源。
3.一个资源可以有多个唯一的URL。
4.多个资源不能具有相同的URL。
2.如何启用路由?
1.在Asp.Net Core Web应用中,我们可以通过中间件启用路由(routing)。
2.我们需要在http管线中插入以下两个中间件
·UseRouting()
·UseEndpoint()
也就是在Startup.cs脚本Configure方法中的这两句代码:
app.UseRouting();
app.UseEndpoints(endponits =>
{
endponits.MapControllers();
});
3.在事件的Action方法上设置路由
新建一个value控制器,如果不知道如何创建,请参考:Web API学习笔记(四)——添加一个控制器类(Controller class)
ValuesController.cs脚本代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
namespace MyWebApi.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
[Route("get1")]
public string Get1()
{
return "I am Get1";
}
[Route("get2")]
public string Get2()
{
return "I am Get2";
}
}
}
记得运行时把Startup.cs脚本Configure方法中有中间件方法的地方给注释掉,不然可能会出现一些阻塞。
运行结果:
get1:
get2:
Routing里也可改为以下模版:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
namespace MyWebApi.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
[Route("get/1")]
public string Get1()
{
return "I am Get1";
}
[Route("get/2")]
public string Get2()
{
return "I am Get2";
}
}
}
运行结果:
1:
2:
4.在路由中使用变量
4.1 使用单个变量
继续在ValuesController加入GetId方法,如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
namespace MyWebApi.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
[Route("get/1")]
public string Get1()
{
return "I am Get1";
}
[Route("get/2")]
public string Get2()
{
return "I am Get2";
}
[Route("students/{id}")]
public string GetId(int id)
{
return "Get students id :" + id;
}
}
}
运行结果:
4.3 使用多个变量
继续在ValuesController加入GetIdAndScore方法,如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
namespace MyWebApi.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
[Route("get/1")]
public string Get1()
{
return "I am Get1";
}
[Route("get/2")]
public string Get2()
{
return "I am Get2";
}
[Route("students/{id}")]
public string GetId(int id)
{
return "Get students id :" + id;
}
[Route("students/{id}/score/{score}")]
public string GetIdAndScore(int id, int score)
{
return "Get students id :" + id + " score:" + score;
}
}
}
运行结果:
4.4 使用Query String
继续在ValuesController加入SearchStudents方法,如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
namespace MyWebApi.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
[Route("get/1")]
public string Get1()
{
return "I am Get1";
}
[Route("get/2")]
public string Get2()
{
return "I am Get2";
}
[Route("students/{id}")]
public string GetId(int id)
{
return "Get students id :" + id;
}
[Route("students/{id}/score/{score}")]
public string GetIdAndScore(int id, int score)
{
return "Get students id :" + id + " score:" + score;
}
[Route("search")]
public string SearchStudents(int id,string name,int score)
{
return string.Format("Id:{0}\nname:{1}\nscore:{2}",id,name,score);
}
}
}
使用Query String 进行访问:http://localhost:5000/api/values/search?id=15&name=Lice&score=90
运行结果:
5.为单个资源设置多个URL
[Route("get/1")]
[Route("get1")]
public string Get1()
{
return "I am Get1";
}
6.多个资源相同的URL(错误示例)
[Route("get/1")]
[Route("get1")]
[Route("get")]
public string Get1()
{
return "I am Get1";
}
[Route("get/2")]
[Route("get")]
public string Get2()
{
return "I am Get2";
}
之前已经说过了,多个资源不能具有相同的URL。
7.路由中的令牌替换
[Route("get/1")]
[Route("get1")]
[Route("[controller]/[action]")]
public string Get1()
{
return "I am Get1";
}
[controller]这里填控制器的名称
[action]这里填方法的名称
运行示例:
8.在控制器级别设置基本路由
也就是在控制器类上加上[Route(“[controller]/[action]”)]
如图所示
然后把方法名上的路由都注释掉就可以了,按照控制器名称/方法名都方法进行URL访问,Web API提供了多种路由配置的方法,学到这儿,大家可按照自己的喜好来配置路由。
9.路由约束验证路由变量
1.约束类型:int,bool,datatime,double,float, etc.
新建一个Books控制器
BooksController.cs代码如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
namespace MyWebApi.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class BooksController : ControllerBase
{
[Route("{id}")]
public string GetIntId(int id)
{
return "Int id is " + id;
}
[Route("{id}")]
public string GetStringId(string id)
{
return "String id is " + id;
}
}
}
若直接运行测试则会报以下错:
加了约束后代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
namespace MyWebApi.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class BooksController : ControllerBase
{
[Route("{id:int}")]
public string GetIntId(int id)
{
return "Int id is " + id;
}
[Route("{id}")]
public string GetStringId(string id)
{
return "String id is " + id;
}
}
}
运行结果:
int:
string:
2.约束最小、最大值(Min:min(number),Max:max(number))
对于BooksController.cs脚本GetIntId方法增加约束如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
namespace MyWebApi.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class BooksController : ControllerBase
{
[Route("{id:int:min(10):max(100)}")]
public string GetIntId(int id)
{
return "Int id is " + id;
}
[Route("{id}")]
public string GetStringId(string id)
{
return "String id is " + id;
}
}
}
运行结果:
做了约束之后在99满足10-100范围内为Int.
做了约束之后在999不满足10-100范围内为String.
3.约束最小、最大长度、固定长度(MinLength:minlength(10),MaxLength:maxlength(20)、Length:length(15))
对于BooksController.cs脚本修改如下
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
namespace MyWebApi.Controllers
{
[Route("api/[controller]")]
[ApiController]
public class BooksController : ControllerBase
{
[Route("{id:int:min(10):max(100)}")]
public string GetIntId(int id)
{
return "Int id is " + id;
}
[Route("{id:minLength(5)}")]
public string GetStringId(string id)
{
return "String id is " + id;
}
}
}
测试结果:
当长度小于5时,不满足条件
当长度大于5时,满足条件
MaxLength和Length可以此类推。
4.范围(Range:range(10,15))
这个用法效果和最大最小值约束作用差不多,如果是range(10,15)实际都是闭区间[10,15]。
[Route("{id:int:range(10,15)}")]
public string GetIntRangeId(int id)
{
return "Int range id is " + id;
}
5.字母约束(Alpha:alpha)
[Route("{id:length(5):alpha}")]
public string GetAlphaId(string id)
{
return "Int range id is " + id;
}
6.正则约束(regex)
[Route("{id:regex(a(b|c))}")]
public string GetRegexId(string id)
{
return "Regex id is " + id;
}