前言
每一个做后端的程序猿必须知道的HTTP服务,所以WEBAPI是.net软件开发工程师必须会的,在这里留下我学习WEBAPI的一些心得和体会,我们从最基础的一点一点学习。
正题
从MVC到WebApi,路由机制一直是伴随着这些技术的一个重要组成部分。
WEBAPI的学习最基础也是第一个应该学习的就应该是WEBAPI的路由,若连路由都不懂(都不知道怎么请求方法)谈何学习后面的知识?(划重点)
下面正式揭开WEBAPI使用RESTful风格定义路由的面纱
一:WEBAPI路由的基础
首先创建一个WEBAPI项目(使用的是VS2015)
选择WEBAPI项目
创建完成之后会找到在App_Start目录下有一个WebApiConfig.cs,这个文件就是今天的主角,以下步骤将围绕着这个文件进行学习。
贴上主角代码:
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Configure Web API to use only bearer token authentication.
config.SuppressDefaultHostAuthentication();
config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
我们主要看MapHttpRoute方法,这个方法有4个重载方法。
分别来看一下它的方法参数有什么用:
- name:表示路由的名称
- routeTemplate:路由的规则,向这个Api中请求什么方法完全看这个routeTemplate的规则制定
- defaults:路由规则的参数设定。
- constraints:路由的约束,如参数约束等。
这些参数若是不懂可以暂不理解,在后续的学习中会慢慢的体会到这些参数的用法。
二。WEBAPI的路由设定
上面讲述了一些WEBAPI的项目创建和路由文件的基础解释,下面开始介绍WEBAPI的路由如何配置,有什么让人眼前一亮的规则。
a.默认路由
首先创建一个API控制器
并写下以下代码:
public class StartController : ApiController
{
[HttpGet]
public string Get()
{
return "MyApi";
}
}
很简单的一个Get方法,下面我们运行项目去访问这个方法
我们来分析一下这个URL,localhost:64437本地运行端口为64437,不用解释;
/api/Start 对应我们在WebApiConfig.cs文件中的默认路由对应api/{controller}没毛病,
路由另一个参数defaults设定为new { id = RouteParameter.Optional }(表示可以带参数也可以不带参数)也没问题。
小结:
WEBAPI路由匹配规则根据请求的类型(Get,Post,put,delete)和参数去匹配对应的方法,MVC的路由规则WEBAPI同样适用但 不提倡,WEBAPI提倡RESTful风格(个人理解)
b.自定义路由
我们在Start控制器中重载一个Get方法
public class StartController : ApiController
{
[HttpGet]
public string Get()
{
return "MyApi";
}
[HttpGet]
public string Get(int ID)
{
return "MyApi" + ID;
}
}
在路由中写上我们自定义的路由
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Configure Web API to use only bearer token authentication.
config.SuppressDefaultHostAuthentication();
config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
//自定义路由
config.Routes.MapHttpRoute(
name: "StartApi",
routeTemplate: "Start/{controller}/{OrderCode}/{id}",
defaults: new { orderCode = "123", id = RouteParameter.Optional }
);
}
然后运行项目通过几个例子来了解WEBAPI的路由规则
第一个例子:
这里成功请求到了无参的Get方法,分析一下Url,/Start/Start/123/匹配到Start/{controller}/{OrderCode}/{id} 。基础部分讲解到了defaults这个参数是设定路由参数的,这里我们设定orderCode = "123",所以在URL中我们也要写上123,写别的就不能成功请求。
第二个例子:
成功请求到带Int类型参数的Get方法,由此可见WEBAPI路由规则是通过请求类型和请求参数来匹配到具体方法
c.WEBAPI特性路由
有一种情况:
[HttpGet]
public string Get()
{
return "MyApi";
}
[HttpGet]
public string Get1()
{
return "MyApi1";
}
当我这个API控制器里面两个方法都是Get请求,且参数都是一样的 ,那就不好办了。
有这种出现时我们需要启用特性路由
public static void Register(HttpConfiguration config)
{
// Web API configuration and services
// Configure Web API to use only bearer token authentication.
config.SuppressDefaultHostAuthentication();
config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
// Web API routes
//启用WenAPI特性路由
config.MapHttpAttributeRoutes();
//默认路由
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
//自动以路由
config.Routes.MapHttpRoute(
name: "StartApi",
routeTemplate: "Start/{controller}/{OrderCode}/{id}",
defaults: new { orderCode = "123", id = RouteParameter.Optional }
);
}
特性路由如何使用,请看以下代码:
public class StartController : ApiController
{
[Route("Start/AAAA")]
[HttpGet]
public string Get()
{
return "MyApi";
}
[Route("Start/BBBB")]
[HttpGet]
public string Get1()
{
return "MyApi1";
}
}
只需要加上[Route()]特性
成功请求到第一个Get方法
成功请求到第二个Get方法
带参数的特性路由:[Route("Start/{ID}/AAAA")]
带默认值和约束参数的特性路由:带参数的特性路由:[Route("Start/{ID:int=3 }/AAAA")]
PS: 错误写法[Route("Start/{ID : int = 3 }/AAAA")],特性路由中间不能有空格否则会报错
d.路由前缀
若整个API控制器里面的方法都用同一个前缀,则需要在控制器类上加上特性
[RoutePrefix("api/Start")]
代码如下
[RoutePrefix("api/Start")]
public class StartController : ApiController
{
[Route("{ID:int=3}/AAAA")]
[HttpGet]
public string Get(int ID)
{
return "MyApi" + ID;
}
[Route("BBBB")]
[HttpGet]
public string Get1()
{
return "MyApi1";
}
}
总结:以上便是WEBAPI的路由规则学习。
在此谢谢懒得安分大牛分享的文章。