ASP.NET Web API 是一种用于在 .NET Framework 上构建 RESTful 应用程序的理想平台。
们要想学习web api 就要去了解它的路由机制。MVC和web api的路由机制的主要区别是web api 使用的是http 方法而不是url 的路径。本文就演示一下web api 是怎样在controller 里映射 http 请求的。
web api 路由
在 web api 中 controller 是用来操作http 请求的。它里面的action 方法 对应不同的http 请求的方法。当 web api 收到一个http 请求的
时候 ,路由表就会将请求映射到对应的action 方法中。
路由表的定义是在 App_Start文件夹的WebApiConfig.cs类中,路由的定义其实和mvc 的差不多的。
1 public static void Register(HttpConfiguration config) 2 { 3 // Web API configuration and services 4 5 // Web API routes 6 config.MapHttpAttributeRoutes(); 7 8 config.Routes.MapHttpRoute( 9 name: "DefaultApi", //这个可以随意命名 10 routeTemplate: "api/{controller}/{id}",//web api 的地址 11 defaults: new { id = RouteParameter.Optional } 12 ); 13 }
在 Global.asax 中注册 路由。
1 protected void Application_Start() 2 { 3 AreaRegistration.RegisterAllAreas(); 4 5 WebApiConfig.Register(GlobalConfiguration.Configuration);//注册 api 路由 必须写在mvc 路由注册之前否则会找不到。 6 FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 7 RouteConfig.RegisterRoutes(RouteTable.Routes); 8 }
当web api 框架收到http 请求的时候,它会尝试的去从路由表中的模板中匹配这个URL,如果不匹配将会显示404的错误。比如我们注册的这个模板就
会匹配一下的地址:
api/WebApi
api/WebApi/2222
api/Home/werwrwe
下面的就不会匹配,因为他们少了api/这个参数:
WebApi
WebApi/2222
Home/werwrwe
这个api/的参数是为了避免和mvc 的 路由有所冲突,当然你可以随意的去命名。
一旦请求的地址被匹配,web api 将会选择相对应controller 和 action
- 1,模板中的{controller}将对应请求地址中的controller。
- 2,web api 将会根据http 请求的方法来找到以这个方法的名字开头的 action ,比如说如果请求的是GET 方法,web api 就会找 以get 开头 action,getname getdata 等等。仅仅适用于 GET,POST,PUT,DELETE这四种方法。当然还可以设置其他的方法,需要在controller 上添加属性。
- 3,模板中的占位符比如{id} 用来匹配传进来的参数的。
比如 :
1 public class TestController : ApiController 2 { 3 public IEnumerable<TestModel> GetAllData() { } 4 public TestModel GetDataById(int id) { } 5 public HttpResponseMessage Delete(int id){ } 6 public HttpResponseMessage Post(TestModel test){} 7 public HttpResponseMessage Put(TestModel test){} 8 }
下面是每个http 请求对应的 action 方法:
| Http 请求方法 | 对应的 action | url | 参数 | 操作 |
| GET | GetAllData/GetDataById | api/webapi/1 | 1 | 获取 |
| POST | Post | api/webapi | 添加 | |
| DELETE | Delete | api/webapi | 删除 | |
| PUT | Put | api/webapi | 更新 |
设置action 特性来接受http 请求
这个是接受get 请求的,action 的名字可以不用get 开头。
1 public class TestController : ApiController 2 { 3 [HttpGet] 4 public IEnumerable<TestModel> Find() { } 5 }
还可以接受那四个请求之外的http 请求或者多个请求:
1 public class TestController : ApiController 2 { 3 [AcceptVerbs("GET", "HEAD")] 4 public IEnumerable<TestModel> Find() { } 5 6 [AcceptVerbs("MKCOL")] 7 public void Deatil() { } 8 }
我们还可以按照mvc 的方式来定义 web api 的模板,比如:
1 routes.MapHttpRoute( 2 name: "api", 3 routeTemplate: "api/{controller}/{action}/{id}", 4 defaults: new { id = RouteParameter.Optional } 5 );
它就可以和api/test/find 相匹配。
我们还可以在action 上定义action 的名字:
1 public class TestController : ApiController 2 { 3 [AcceptVerbs("GET", "HEAD")] 4 [ActionName("test")] 5 public IEnumerable<TestModel> Find() { } 6 }
那么api/test/test 就可以进入上面的那个方法。
如果设置NoAction
1 public class TestController : ApiController 2 { 3 4 [NonAction] 5 public IEnumerable<TestModel> Find() { } 6 }
那么web api 就不会认为它是一个 action 即使与模板匹配也不会被调用。