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 即使与模板匹配也不会被调用。

 

相关文章:

  • 2021-05-25
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-10-05
  • 2022-01-27
  • 2018-04-06
  • 2022-12-23
猜你喜欢
  • 2021-12-27
  • 2021-11-01
  • 2021-10-23
  • 2021-07-17
  • 2021-12-08
相关资源
相似解决方案