WebApi自定义路由 Route 与 RoutePrefix 的用法

WebAPI可以通过[Route]和[RoutePrefix]来自定义路由,[RoutePrefix]作用于Controller,[Route]作用于Action

Route  与 RoutePrefix的用法

namespace WebApi.Controllers
{
    //注意:RoutePrefix是搭配Route来使用的。单独在控制器类上标注RoutePrefix是不起作用的
    [RoutePrefix("api/MyHome")] 
    public class HomeController : ApiController
    {
        [Route("GetString")]  //我们也可以不在控制器上标注RoutePrefix 只要这样写就可以[Route("api/MyHome/GetString")] 
        public string GetString(string username)
        {
            return "你输入的是:" + username;
        }
    }

    //解释说明:如果我们在控制器上标注了[RoutePrefix("api/MyHome")]  同时又在控制器的方法上标注了 [Route("GetString")]
    //          那么这个方法的访问地址就是 http://localhost:14483/api/MyHome/GetString?username=tom 
    //假如我们没有在控制器方法上标注[RoutePrefix("api/MyHome")] 而是仅仅在控制器方法上标注了[Route("GetString")]
    //          那么这个方法的访问地址就是 http://localhost:14483/GetString?username=tom

    //注意:RoutePrefix仅仅是用来修饰Route路由的前缀的。可有可无。真正起路由作用的是打在控制器方法上的Route
    //打个比方:假如控制器中有100个方法都需要打上[Route("api/MyHome/GetBy....")]标注 为了省事 我就在控制器类上标注
    //[RoutePrefix("api/MyHome")] 这样控制器中的100个方法只要标注[Route("GetBy....")] 就可以了。省了点代码量而已

    //当我们在控制器方法上标注了[Route]那么我们在WebApiConfig.cs配置类中配置的routeTemplate路由模板就不起作用了
}

RoutePrefix 和Route搭配使用(当然只用Route也行)的第二种作用是从url捕获参数(无论get、post等都可以)

例如:

namespace WebApi.Controllers
{
    //注意:RoutePrefix是搭配Route来使用的。单独在控制器类上标注RoutePrefix是不起作用的
    [RoutePrefix("api/MyHome")]
    public class HomeController : ApiController
    {
		[HttpGet] //Get方法可以请求
        [HttpPost] //Post也可以请求
        [Route("Login/{name}/{password}")]
        public bool Login(string name, string password)//通过Get请求和Post请求,name的值为admin,password的参数是123456
        {
            return (name == "admin" && password == "123456");
        }
    } 
}

Get请求地址: http://localhost:14483/api/MyHome/Login/admin/123456

Post请求地址:http://localhost:14483/api/MyHome/Login/admin/123456 

我们发现 这样一搞,就可以将 name 参数和password参数都可以用url地址的形式映射到方法参数里面

public class HomeController : Controller
{      
    public async Task<ActionResult> Index()
    {
        HttpClient hc = new HttpClient();

        Dictionary<string, string> kv = new Dictionary<string, string>();
        //kv["name"] = "admin";   
        //kv["password"] = "123456";  //这里不传值,而是直接在请URL地址中将值传过去

        FormUrlEncodedContent content = new FormUrlEncodedContent(kv);
        var task = await hc.PostAsync("http://localhost:14483/api/MyHome/Login/admin/123456", content);
        var result = await task.Content.ReadAsStringAsync();
        return View();
    }
}


  • 7
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值