ASP.NET Web API实践系列03,路由模版, 路由惯例, 路由设置
2014-10-25 09:54
579 查看
ASP.NET Web API的路由和ASP.NET MVC相似,也是把路由放在RouteTable中的。可以在App_Start文件夹中的WebApiConfig.cs中设置路由模版。默认的路由模版是:
● 静态片段api,主要用来区分ASP.NET MVC的路由。
● 为什么没有{action}?默认情况下,可以根据惯例找到Action,只要Action的名称符合惯例。
● 占位符变量{id}映射Action的参数。
□ 根据惯例路由
对于GET,POST,PUT,DELETE请求,如果Action的名称以Get, Post, Put, Delete开头,这就是符合惯例,意味着在请求的url中无需指明Action,就可以路由到对应的Action中。
假设有这样的一个api控制器:
● 浏览器输入:api/books 并且是Get请求
不带参数,由于GetAllBooks的名称以Get开头,符合惯例,这里会映射到GetAllBooks方法。
● 浏览器输入:api/books/8 并且是Get请求
带参数,会映射到GetBookById(int id)方法上。Web API会把字符串类型的8赋值给int类型的参数变量id。
● 浏览器输入:api/books/8 并且是DELETE请求
映射到DeleteProduct(int id)
● 浏览器输入:api/books 并且是POST请求
没有对应POST请求的Action。返回404状态码。
□ 根据HTTP方法路由
HttpGet, HttpPut, HttpPost, HttpDelete属性可以打在Action上面。
如果一个Action允许有多个HTTP方法,就使用AcceptVerbs属性。
□ 考虑Action的路由
我们可以在WebApiConfig.cs中设置路由的模版,把Action考虑进去。
在api控制器中:
此时,在浏览器中输入类似"api/books/details/8"的格式,才能映射到Details(int id)方法上。
还可以通过ActionName属性给Action取别名:
如果不想让Action参与到路由中,可以使用NoAction属性。
总结:在WebApiConfig.cs中定义的路由模版都被放到了RouteTable中了。在Action层面,如果想让请求路由到Action上,可以通过惯例、Http方法属性来实现。
routes.MapHttpRoute(
name: "API Default",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
● 静态片段api,主要用来区分ASP.NET MVC的路由。
● 为什么没有{action}?默认情况下,可以根据惯例找到Action,只要Action的名称符合惯例。
● 占位符变量{id}映射Action的参数。
□ 根据惯例路由
对于GET,POST,PUT,DELETE请求,如果Action的名称以Get, Post, Put, Delete开头,这就是符合惯例,意味着在请求的url中无需指明Action,就可以路由到对应的Action中。
假设有这样的一个api控制器:
public class BooksController : ApiController
{
public void GetAllBooks(){}
public IEnumerable<Book> GetBookById(int id)
public HttpResponseMessage DeleteProduct(int id){}
}
● 浏览器输入:api/books 并且是Get请求
不带参数,由于GetAllBooks的名称以Get开头,符合惯例,这里会映射到GetAllBooks方法。
● 浏览器输入:api/books/8 并且是Get请求
带参数,会映射到GetBookById(int id)方法上。Web API会把字符串类型的8赋值给int类型的参数变量id。
● 浏览器输入:api/books/8 并且是DELETE请求
映射到DeleteProduct(int id)
● 浏览器输入:api/books 并且是POST请求
没有对应POST请求的Action。返回404状态码。
□ 根据HTTP方法路由
HttpGet, HttpPut, HttpPost, HttpDelete属性可以打在Action上面。
public class BooksController : ApiController
{
[HttpGet]
public Book FindBook(id){}
}
如果一个Action允许有多个HTTP方法,就使用AcceptVerbs属性。
public class BooksController ; ApiController
{
[AcceptVerbs("GET","HEAD")]
public Book FindProduct(id){}
}
□ 考虑Action的路由
我们可以在WebApiConfig.cs中设置路由的模版,把Action考虑进去。
routes.MapHttpRoute(
name: "ActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
在api控制器中:
public class BooksController : ApiController
{
[HttpGet]
public string Details(int id);
}
此时,在浏览器中输入类似"api/books/details/8"的格式,才能映射到Details(int id)方法上。
还可以通过ActionName属性给Action取别名:
public class BooksController : ApiController
{
[ActionName("Sth")]
public HttpResposneMessage GetSth(int id);
}
如果不想让Action参与到路由中,可以使用NoAction属性。
public class BooksController : ApiController
{
[NonAction]
public string GetSomeData(){}
}
总结:在WebApiConfig.cs中定义的路由模版都被放到了RouteTable中了。在Action层面,如果想让请求路由到Action上,可以通过惯例、Http方法属性来实现。
相关文章推荐
- ASP.NET Web API实践系列04,通过Route等特性设置路由
- ASP.NET Web API实践系列04,通过Route等特性设置路由
- ASP.NET Web API实践系列09,在Fiddler和控制台中模拟GET和POST请求
- 【Web API系列教程】2.1 — ASP.NET Web API中的路由机制
- ASP.NET Web API实践系列06, 在ASP.NET MVC 4 基础上增加使用ASP.NET WEB API
- ASP.NET Web Api 实践系列(二)Get/Post方式调用Web Api
- 【Web API系列教程】2.3 — ASP.NET Web API 2中的属性路由
- ASP.NET Web API实践系列11,如何设计出优秀的API
- ASP.NET Web API实践系列05,消息处理管道
- ASP.NET Web API实践系列01,以ASP.NET Web Form方式寄宿
- ASP.NET Web API实践系列02,在MVC4下的一个实例, 包含EF Code First,依赖注入, Bootstrap等
- ASP.NET Web API实践系列07,获取数据, 使用Ninject实现依赖倒置,使用Knockout实现页面元素和视图模型的双向绑定
- ASP.NET Web Api 实践系列(一)自我寄宿
- 【Web API系列教程】2.2 — ASP.NET Web API中的路由和动作选择机制
- ASP.NET MVC实践系列8-对查询后分页处理的解决方案
- ASP.NET开发实践系列课程之数据库调优
- Asp.Net大型项目实践系列导航
- ASP.NET开发实践系列课程之跨站脚本(XSS)的攻防
- ASP.NET开发实践系列课程之前端调优
- Asp.Net大型项目实践系列导航 [以后要仔细看的,支持作者 转]