近来刚刚开始做web api的项目, 本人菜鸟,有误请见谅, 下面一段关于web api默认路由的简单修改描述。
首先在visual studio 2017新建一个web api 的项目:
建好之后,可以看到一些默认的文件:
比如说 controllers 文件夹里面有:homeController 和 ValuesController ; App_Start文件夹里面有 RouteConfig 和 WebApiConfig ;
我们不修改任何东西, 先运行看看结果:
运行之后,可以看到home.Index页面 , 然后我们试一试 ValuesController 里面的方法:
在地址栏输入:
http://localhost:xxx/api/values
http://localhost:xxx/api/values/57
就能看到 valuescontroller里面的 方法返回值:
public class ValuesController : ApiController
{
// GET api/values
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
// GET api/values/5
public string Get(int id)
{
return "value"+id;
}
看到这里,我会非常不习惯 webAPI 的路由规则, 看了看 routing 规则 : WebApiConfig.cs 文件才发现:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
Default 里面是 api/{controller}/{id} 的规则, 不想asp./net mvc 里面默认的 "{controller}/{action}/{id}"
我看了看网上的文章说 Restful风格中不关注 action 的定义 , 所以默认路由就是没有action这也串字符的。
由于不习惯,我可以修改WebApiConfig 里面的 Routes 代码 。
除了修改WebApiConfig 里面的 Routes 代 ,我在网上还看到了一个更加直观的方式: ,比如说我新建了两个controller :
public class CustomerController : ApiController
{
[HttpGet]
[Route("api/Customer/add")]
public IHttpActionResult AddNewCustomer(int id , string name )
{
Customer c1 = new Customer { CustomerID = id, CustomerName = name };
return Ok(c1);
}
}
public class ProductsController : ApiController
{
Product[] products = new Product[] {
new Product { Name="唐诗三百首" , Category="图书" , Price =50 },
new Product { Name="服务模式" , Category="图书" , Price=40 },
new Product { Name="可乐" , Category="食物" , Price=3}
};
[Route("api/Products/GetAll")]
public IEnumerable<Product> GetAllProduct()
{
return products;
}
[Route("api/Products/Getbyname")]
public IHttpActionResult GetProductByName(string name)
{
var p = products.Where(x => x.Name == name);
if (p == null)
{
return NotFound();
}
return Ok(p);
}
}
我分别在 各个ActionResult 前面加入了 [Route("xx/xx")]
这个代码就能改变controller/action 的路由了,
比如
http://localhost:xxx/api/customer/add?id=2&name=雄安
http://localhost:xxx/api/Products/Getbyname?name=可乐
http://localhost:xxx/api/Products/getall
这样子的话,就跟原本用的MVC差不多了 , 其实我也不知道默认路由下不用action 的意图是什么。。。菜鸟无法回答,只能用自己熟悉的。