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