网站转移动版,网站开发与软件销售,什么网站可以帮人做ppt赚钱,制作个人网站实例一. 原生态接口
1. 从默认路由开始分析 在WebApiConfig.cs类中的Register方法中#xff0c;我们可以看到默认路由如下#xff1a; 分析#xff1a;请求地址在 controller 前面需要加上 api/#xff0c;controller后面没有action#xff0c;最后有一个参数{id}#xff0c…一. 原生态接口
1. 从默认路由开始分析 在WebApiConfig.cs类中的Register方法中我们可以看到默认路由如下 分析请求地址在 controller 前面需要加上 api/controller后面没有action最后有一个参数{id}webapi默认的路由规则就是一种RestFul风格的接口调用规则。
2. WebApi的默认调用规则
(1). 方法名默认为Get或者GetXXX开头的只接受get请求默认为Post或者PostXXX开头的只接受Post请求如果标注[HttpGet]、[HttpPost]等特性的话则以特性为主。
(2). 不以GetXX或者PostXX等特殊开通的通过标注[HttpGet]等特性也可以进行访问, 比如下面的UserInfor方法通过添加[HttpGet]特性就可以进行Get访问了。 PS其它特殊的调用接受规则详见下一节。
3. 实战测试 前提以下所有的Action都位于FirstController下路由规则使用的是WebApi的默认路由规则。
(1).无参Get方法 请求方式Get请求请求地址http://localhost:2131/api/First
(2).有参数的Get方法参数名为int id 请求方式Get请求请求地址http://localhost:2131/api/First/5 或者 http://localhost:2131/api/First/?id5
分析默认的路由规则api/{controller}/{id}最后一个是 {id}而该方法的参数名也为id所以可以 api/First/5 拼接如果这里路由规则为api/{controller}/{id2}方法的参数名必须为 int id2才可以 api/First/5 这样拼接。
(3). 有参数的Get方法参数名为 int id2 分析该方法和上述的Get(int id)不能共存因为不满足重载规范该方法只能通过 api/First?id2111 的模式进行Get请求不能通过api/First/2的模式进行请求因为路由中最后一位是 {id}而不是{id2}。
(4). 有string参数的Get方法 请求方式Get请求请求地址分别为http://localhost:2131/api/First/?userName5 、http://localhost:2131/api/First/?str5
(5). 多个参数且不以Get开头标注[HttpGet]特性 请求方式Get请求请求地址为http://localhost:2131/api/First/?id5nameypf
(6). 带一个参数的Post请求 请求方式如下 (7). 带一个参数的Delete请求 请求方式Delete 请求地址http://localhost:2131/api/First/?id5 或者 http://localhost:2131/api/First/5
(8). 带一个参数的Put请求 存在问题postman请求服务器端拿不到value的值。 稍后解决 二. 路由规则
1. 简介 WebApi有两种路由规则默认路由和特性路由,都位于WebApiConfig类中的Register方法里进行配置 (1). config.MapHttpAttributeRoutes(); 代表特性路由 (2). config.Routes.MapHttpRoute(); 代表统一的默认路由
特别注意特性路由的优先级 大于 默认路由的优先级
2. 默认路由 WebApi的默认路由为routeTemplate: api/{controller}/{id}不含action且最后一个参数名为id只有参数名为id的时候才可以通过api/xxx/1 这种方式进行访问。 默认路由可以同时声明多个只要里面的name值不一样即可满足任何一个路由规则都可以访问。
演示增加两个路由名字分别为DefaultApi2和DefaultApi3下面的GetUseName方法通过这两个路由规则 api2/Third/GetUserName?userName1234 或者 api3/Third/GetUserName?userName1234 都可以访问
(PS:需要注释掉相关的[RoutePrefix]和[Route]) 服务器端代码 3. 特性路由
(1). 可以通过[Route]和[RoutePrefix]这两个标记来自定义路由规则[Route]作用于action[RoutePrefix]作用于Controller 一旦设置了其中任何一个默认路由routeTemplate就不起任何作用了。
(2). 当[RoutePrefix]和[Route]都存在的话规则为二者的拼接结合先[RoutePrefix] 后[Route]
案例测试
A下面的GetM1(string userName)方法增加特性 [Route(myApi/Third/GetM1)]注视掉控制器上的[RoutePrefix]特性保留默认路由DefaultApi2和DefaultApi3 则该方法需要通过http://localhost:2131/myApi/Third/GetM1?userName1234 进行访问。
B下面的GetM2(string userName)方法增加特性 [Route(myApi/Third/GetM2)]控制器上增加[RoutePrefix(ypfApi/Third)]保留默认路由DefaultApi2和DefaultApi3 则该方法需要通过http://localhost:2131/ypfApi/Third/myApi/Second/GetM2?userName1234 进行访问。
C下面的GetFullName(string firstName,string lastName)方法增加特性 [Route(myApi/Third/GetFullName/{firstName}/{lastName})]注视掉控制器上的[RoutePrefix]特性 保留默认路由DefaultApi2和DefaultApi3。
则该方法可以通过http://localhost:2131/myApi/Third/GetFullName/姚/大宝 进行访问 1 //[RoutePrefix(ypfApi/Third)]2 public class ThirdController : ApiController3 {4 /// summary5 /// 演示多个默认路由的情况6 /// 需要把控制器的特性注释掉需要把WebApiConfig中的 DefaultApi2和DefaultApi3两个路由打开其他的都注释掉7 /// /summary8 /// param nameuserName/param9 /// returns/returns
10 [HttpGet]
11 public string GetUserName(string userName)
12 {
13 return $userName的值为{userName};
14 }
15
16 /// summary
17 /// 演示淡出的[Route]特性
18 /// /summary
19 /// param nameuserName/param
20 /// returns/returns
21 [Route(myApi/Third/GetM1)]
22 [HttpGet]
23 public string GetM1(string userName)
24 {
25 return $GetM1您的返回值为{userName};
26 }
27
28 /// summary
29 /// 演示[RoutePrefix]和[Route]
30 /// /summary
31 /// param nameuserName/param
32 /// returns/returns
33 [Route(myApi/Third/GetM2)]
34 [HttpGet]
35 public string GetM2(string userName)
36 {
37 return $GetM2您的返回值为{userName};
38 }
39
40 /// summary
41 /// 演示自定义[Route]的特殊写法
42 /// /summary
43 /// param namefirstName/param
44 /// param namelastName/param
45 /// returns/returns
46 [Route(myApi/Third/GetFullName/{firstName}/{lastName})]
47 [HttpGet]
48 public string GetFullName(string firstName,string lastName)
49 {
50 return $firstName值为{firstName},lastName值为{lastName};
51 }
52
53 } 5. 特性路由的作用
(1). 标记特殊的访问路径,该功能有点鸡肋用的比较少。
(2). 多版本控制的时候会使用. 后面介绍