WebApi - 路由

这段时间的博客打算和你们一块儿分享下webapi的使用和心得,主要缘由是群里面有朋友说但愿能有这方面的文章分享,随便本身也再回顾下;后面将会和你们分不一样篇章来分享交流心得,但愿各位多多扫码支持和点赞,谢谢,但愿你们喜欢:web

 

. 使用vs建立webapi项目及项目结构介绍api

. 默认路由模板介绍浏览器

. 属性路由标记的使用mvc

 

下面一步一个脚印的来分享:框架

. 使用vs建立webapi项目及项目结构介绍ide

首先,鼠标右键解决方案=》添加=》新建项目=》选择"Asp.net web应用程序"=》输入项目的名称,我这里是Stage.Api=》点击肯定按钮,效果如:函数

而后会弹出一个界面,里面有三种模板选择,这里简单介绍下;测试

1. 选择"Empty模板"=》勾选"Web Api",若是不须要测试的话便可点击"肯定"按钮就好了,而后解决方案中会生成一个很空的api项目,这里简单截图下选择的界面图:网站

 

2. 选择“MVC”=》勾选“Web API”=》点击“肯定”,这个界面能够更改身份验证,如图:this

 

3. 选择“Web API”=》直接点击“肯定”(这里始终是选择mvc+webapi,其实就是上面的选择项),这里就再也不截图了各位一尝试点击下试试;

我这里就选择webapi来建立项目,目录结构和说明如:

由于前面建立项目时候勾选了“MVC”与“Web API”,因此这个项目中包括了二者的初始文件,由目录结构能看出mvc和webapi相识度很高,除了试图外几乎能承认同样,固然具体代码仍是有差异的,下面咱们就开始来初步了解下webapi的routing吧;

 

. 默认路由模板介绍

首先,这里只说webapi的默认路由,来看App_Start/WebApiConfig.cs文件中默认路由类代码以下:

 1 public static class WebApiConfig
 2     {
 3         public static void Register(HttpConfiguration config)
 4         {
 5             // Web API configuration and services
 6 
 7             // Web API routes
 8             config.MapHttpAttributeRoutes();
 9 
10             config.Routes.MapHttpRoute(
11                 name: "DefaultApi",
12                 routeTemplate: "api/{controller}/{id}",
13                 defaults: new { id = RouteParameter.Optional }
14             );
15         }
16     }

这个 Register 方法传递的参数 HttpConfiguration 类型;而后 config.MapHttpAttributeRoutes(); 主要功能是:容许项目框架可使用属性标记来扩展路由; config.Routes.MapHttpRoute 对应有四个扩展方法,代码如:

 1 //
 2         // 摘要: 
 3         //     映射指定的路由模板。
 4         //
 5         // 参数: 
 6         //   routes:
 7         //     应用程序的路由的集合。
 8         //
 9         //   name:
10         //     要映射的路由的名称。
11         //
12         //   routeTemplate:
13         //     路由的路由模板。
14         //
15         // 返回结果: 
16         //     对映射路由的引用。
17         public static IHttpRoute MapHttpRoute(this HttpRouteCollection routes, string name, string routeTemplate);
18         //
19         // 摘要: 
20         //     映射指定的路由模板并设置默认路由值。
21         //
22         // 参数: 
23         //   routes:
24         //     应用程序的路由的集合。
25         //
26         //   name:
27         //     要映射的路由的名称。
28         //
29         //   routeTemplate:
30         //     路由的路由模板。
31         //
32         //   defaults:
33         //     一个包含默认路由值的对象。
34         //
35         // 返回结果: 
36         //     对映射路由的引用。
37         public static IHttpRoute MapHttpRoute(this HttpRouteCollection routes, string name, string routeTemplate, object defaults);
38         //
39         // 摘要: 
40         //     映射指定的路由模板并设置默认路由值和约束。
41         //
42         // 参数: 
43         //   routes:
44         //     应用程序的路由的集合。
45         //
46         //   name:
47         //     要映射的路由的名称。
48         //
49         //   routeTemplate:
50         //     路由的路由模板。
51         //
52         //   defaults:
53         //     一个包含默认路由值的对象。
54         //
55         //   constraints:
56         //     一组表达式,用于限制 routeTemplate 的值。
57         //
58         // 返回结果: 
59         //     对映射路由的引用。
60         public static IHttpRoute MapHttpRoute(this HttpRouteCollection routes, string name, string routeTemplate, object defaults, object constraints);
61         //
62         // 摘要: 
63         //     映射指定的路由模板并设置默认的路由值、约束和终结点消息处理程序。
64         //
65         // 参数: 
66         //   routes:
67         //     应用程序的路由的集合。
68         //
69         //   name:
70         //     要映射的路由的名称。
71         //
72         //   routeTemplate:
73         //     路由的路由模板。
74         //
75         //   defaults:
76         //     一个包含默认路由值的对象。
77         //
78         //   constraints:
79         //     一组表达式,用于限制 routeTemplate 的值。
80         //
81         //   handler:
82         //     请求将被调度到的处理程序。
83         //
84         // 返回结果: 
85         //     对映射路由的引用。
86         public static IHttpRoute MapHttpRoute(this HttpRouteCollection routes, string name, string routeTemplate, object defaults, object constraints, HttpMessageHandler handler);

具体的参数说明已经备注好了,经过备注咱们简单总结下name:某类模板的惟一名称,routeTemplate:路由模板,defaults:默认参数;咱们自动生成的默认模板格式如: api/{controller}/{id} ,由经验得出这里的Controller指的就是咱们在Controllers文件夹中建立的apiController的名称,id对应的是参数,这里有默认值 RouteParameter.Optional 表示id参数可选传递;好了经过参数的分析讲解说明,咋们来在浏览器中访问下咱们自动生成的模板地址,看能获得什么数据,我这里是经过iis指向了我这个webapi项目,访问的地址如: http://localhost:1001/api/values ,这个时候会出现一个错误:

不要慌张,这个所因为咱们初建项目,没有生成形成的(这里简单描述下网站和项目的最大使用区别,1.网站若是是更新了web页面的代码,不须要从新生成 2.若是是项目的话修改了代码必需要从新生成,否则发布没有任何效果),好咋们生成后,从新在浏览器中访问上面的地址,获得以下结果:

再来看一下对应的代码文件 Controllers/ValuesController.cs ,而后代码如:

1  // GET api/values
2         public IEnumerable<string> Get()
3         {
4             return new string[] { "value1", "value2" };
5         }

咱们获得的结果就是这段代码执行出来的数据;

 

. 属性路由标记的使用

这里先来讲下,webapi经常使用到的容许访问方式的标记有GET,POST,PUT,DELETE等,有朋友立马就反应过来这几乎和MVC试图中的设置差很少呢,是的就是这样;而后再来了解下路由标记Route的使用,先来看一段代码:

1 // GET api/values
2         [Route("webapi")]
3         public IEnumerable<string> Get()
4         {
5             return new string[] { "value1", "value2" };
6         }

仔细的朋友可以发现这里就是上面咱们直接访问 http://localhost:1001/api/values 地址的测试代码,如今咱们增长了标记 [Route("webapi")] 有什么做用呢,咋们先来生成下项目,而后再访问以前使用的地址 http://localhost:1001/api/values 获得的结果如:

此时咱们没法正常获得刚才的文字结果,这是由于Route标记吧路由地址改成 http://localhost:1001/webapi 这样直接访问action的方法,好咋们使用该地址在浏览器得出结果以下:

和加Route以前获得的结果是同样的,由此咱们获得Route标记有改变路由地址的功能,下面咱们来看下Route类代码:

 1 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
 2     public sealed class RouteAttribute : Attribute, IHttpRouteInfoProvider
 3     {
 4         public RouteAttribute();
 5         public RouteAttribute(string template);
 6 
 7         public string Name { get; set; }
 8         public int Order { get; set; }
 9         public string Template { get; }
10     }

由上可知咱们刚才使用到了 RouteAttribute(string template) 构造函数来传递对应的参数,看代码中Order,Name两个属性,这个可能会在从此讲解中使用到,之后再说;下面咱们再来看RoutePrefix及她的一段代码相关代码:

1 [RoutePrefix("v")]
2     public class ValuesController : ApiController

再来访问咱们刚才的地址: http://localhost:1001/webapi ,此时获得的错误信息“没法找到资源。”,那咱们再来改变下路径如: http://localhost:1001/v/webapi ,能正常获得结果:

由此RoutePrefix的效果,体现出来了,若是这是了该标记,就须要咱们访问api地址时,须要加上对应的v才行,这个对应的代码是:

1 [AttributeUsage(AttributeTargets.Class, AllowMultiple = false, Inherited = false)]
2     public sealed class RoutePrefixAttribute : Attribute
3     {
4         public RoutePrefixAttribute(string prefix);
5 
6         public string Prefix { get; }
7     }

好了,本篇就到这里了,主要是电脑没电了,下次继续分享webapi文章,但愿各位多多支持,勿喷。

相关文章
相关标签/搜索