Web API学习笔记(六)——路由(Routing)

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;
        }
  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值