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

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Fanbin168/article/details/77829767

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();
    }
}


展开阅读全文

没有更多推荐了,返回首页