C# WebApi使用AttributeRoutes特性路由
1.在创建WebApi中默认的路由规则,只能满足一般简单的RESTful风格,如 api/Products/{id}。
但是在实际运用中很难严格满足RESTful要求的WebApi。因此需要使用高版本的WebApi2。至少对应版本.net4.5.
2.REST这个词,即Representational State Transfer的缩写,是Roy Thomas Fielding在他2000年的博士论文中提出的。REST的名称"表现层状态转化"中,省略了主语。"表现层"其实指的是"资源"(Resources)的"表现层"。
Resources:就是网络上的一个实体,或者说是网络上的一个具体信息。它可以是一段文本、一张图片、一首歌曲、一种服务,总之就是一个具体的实在。你可以用一个URI(统一资源定位符)指向它,每种资源对应一个特定的URI。要获取这个资源,访问它的URI就可以,因此URI就成了每一个资源的地址或独一无二的识别符。
Representation:信息实体(资源)的表现形式,可以用txt格式表现,也可以用HTML格式、XML格式、JSON格式表现,甚至可以采用二进制格式;图片可以用JPG格式表现,也可以用PNG格式表现。
State Transfer:代表了客户端和服务器的一个互动过程。在这个过程中,势必涉及到数据和状态的变化。互联网通信协议HTTP协议,是一个无状态协议。这意味着,所有的状态都保存在服务器端。因此,如果客户端想要操作服务器,必须通过某种手段,让服务器端发生"状态转化"(State Transfer)。而这种转化是建立在表现层之上的,所以就是"表现层状态转化"。客户端用到的手段,只能是HTTP协议。具体来说,就是HTTP协议里面,四个表示操作方式的动词:GET、POST、PUT、DELETE。它们分别对应四种基本操作:GET用来获取资源,POST用来新建资源(也可以用于更新资源),PUT用来更新资源,DELETE用来删除资源。
3.满足RESTful风格要求:
a)应该将API的版本号放入URL。例如:https://api.example.com/v1/,或将版本号放在HTTP头信息中,但不如放入URL方便和直观。Github采用这种做法。
b)在RESTful架构中,每个网址代表一种资源(resource),所以网址中不能有动词,只能有名词,而且所用的名词往往与数据库的表格名对应。一般来说,数据库中的表都是同种记录的"集合"(collection),所以API中的名词也应该使用复数。例如:https://api.example.com/v1/animals
c)对于资源的具体操作类型,由HTTP动词表示。
- GET(SELECT):从服务器取出资源(一项或多项)。
 - POST(CREATE):在服务器新建一个资源。
 - PUT(UPDATE):在服务器更新资源(客户端提供改变后的完整资源)。
 - PATCH(UPDATE):在服务器更新资源(客户端提供改变的属性)。
 - DELETE(DELETE):从服务器删除资源。
 
不常用的HTTP动词:
- HEAD:获取资源的元数据。
 - OPTIONS:获取信息,关于资源的哪些属性是客户端可以改变的。
 
d)如果记录数量很多,服务器不可能都将它们返回给用户。API应该提供参数,过滤返回结果。
- ?limit=10:指定返回记录的数量
 - ?offset=10:指定返回记录的开始位置。
 - ?page=2&per_page=100:指定第几页,以及每页的记录数。
 - ?sortby=name&order=asc:指定返回结果按照哪个属性排序,以及排序顺序。
 - ?animal_type_id=1:指定筛选条件
 
e)服务器返回的数据格式,应该尽量使用JSON,避免使用XML。
4.使用AttributeRoutes特性路由
1》 需要在APP_START里的WebApiConfig.cs的Register方法中添加一行:config.MapHttpAttributeRoutes();
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{ // 启用Web API特性路由
config.MapHttpAttributeRoutes(); //config.Routes.MapHttpRoute(
// name: "DefaultApi",
// routeTemplate: "api/{controller}/{id}",
// defaults: new { id = RouteParameter.Optional }
//);
}
}
若:MapHttpAttributeRoutes有小红线报错,是因为:特性路由只在WebAPI 2中。解决方法:
NuGet package manager--->package manager console,输入如下命令:
Install-Package Microsoft.AspNet.WebApi.WebHost
重启VS
2》将Global.asax文件中WebApiConfig注释。
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas(); GlobalConfiguration.Configure(WebApiConfig.Register); //WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes); } }
3》创建WebApi TestController.cs文件.
如果想给某个API控制器中的所有Action加上一个前缀,可把RoutePrefix特性打在API控制器上。
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Text;
using System.Web.Http; namespace API.Controllers.v1
{
[RoutePrefix("api/v1")]
public class TestController : ApiController
{ [HttpGet]
[Route("Test/{id}/{no}}")]
[CrossDomain]
public HttpResponseMessage Get(string userName, string no)
{
return "";
} [HttpPost]
[Route("Test")]
[CrossDomain]
public int Test([FromBody] dynamic JsonData)
{
return ;
}
}
}
其中CrossDomain属性是跨域请求属性。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http.Filters; namespace API.CustomFilter
{
public class CrossDomainAttribute:ActionFilterAttribute
{
private const string Origin = "Origin"; private const string AccessControlAllowOrigin = "Access-Control-Allow-Origin"; private const string originHeaderdefault = "*"; public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
//base.OnActionExecuted(actionExecutedContext);
actionExecutedContext.Response.Headers.Add(AccessControlAllowOrigin,originHeaderdefault);
}
}
}
下面的表格列出了支持的约束
| 约束 | 介绍 | 示例 | 
|---|---|---|
| alpha | 匹配大写或小写字母 (a-z, A-Z) | {x:alpha} | 
| bool | {x:bool} | |
| datetime | {x:datetime} | |
| decimal | {x:decimal} | |
| double | {x:double} | |
| float | 匹配一个 32位浮点数 | {x:float} | 
| guid | {x:guid} | |
| int | {x:int} | |
| length | 匹配一个长度在指定范围内的字符串 | {x:length(6)} {x:length(1,20)}  | 
| long | {x:long} | |
| max | 匹配指定了最大值的整数 | {x:max(10)} | 
| maxlength | 匹配指定了最大长度字符串 | {x:maxlength(10)} | 
| min | 匹配指定了最小值的整数 | {x:min(10)} | 
| minlength | 匹配指定了最小长度字符串 | {x:minlength(10)} | 
| range | 匹配指定了大小区间的整数 | {x:range(10,50)} | 
| regex | 匹配一个正则表达式 | {x:regex(^\d{3}-\d{3}-\d{4}$)} | 
如果要指定多个约束,需要用冒号间隔 [Route("users/{id:int:min(1)}")]
相关文档:
http://www.ruanyifeng.com/blog/2014/05/restful_api.html
http://blog.csdn.net/qingtian12138/article/details/73857018
https://www.cnblogs.com/TiestoRay/p/5755454.html
https://www.cnblogs.com/wenlong7982/p/5713597.html
C# WebApi使用AttributeRoutes特性路由的更多相关文章
- WebApi深入学习--特性路由
		
特性路由 WebApi2默认的路由规则我们称作基于约定路由,很多时候我们使用RESTful风格的URI.简单的路由是没问题的,如 api/Products/{id},但有些事很难处理的,如资源之间存在 ...
 - [Web API] Web API 2 深入系列(5) 特性路由
		
目录 1. 特性路由注册 2. 路由解析 - 生成DataTokens - 选择HttpController - 选择Action 特性路由的目的在于更好的提供restful架构的接口,最近好忙(懒) ...
 - ASP.NET Web API 2 中的特性路由
		
ASP.NET MVC 5.1 开始已经支持基于特性的路由(http://attributerouting.net),ASP.NET WEB API 2 同时也支持了这一特性. 启用特性路 由只需要在 ...
 - Mvc-WebAPI特性路由(自定义路由)Demo
		
Demo由VS2017编写. 1.先建一个WebApi项目 2.WebApiConfig.cs需要注册特性路由,config.MapHttpAttributeRoutes(); 3.项目默认有2个Co ...
 - ASP.NET WEB API必知必会:特性路由
		
一.什么是特性路由? 特性路由是指将RouteAttribute或自定义继承自RouteAttribute的特性类标记在控制器或ACTION上,同时指定路由Url字符串,从而实现路由映射,相比之前的通 ...
 - MVC特性路由的提供机制
		
回顾:传统路由是如何提供的? 我们知道最终匹配的路由数据是保存在RouteData中的,而RouteData通常又是封装在RequestContext中的,他们是在哪里被创建的呢?没错,回到了UrlR ...
 - ASP.NET没有魔法——ASP.NET MVC 直连路由(特性路由)
		
之前对Controller创建的分析中,知道了Controller的创建是有两个步骤组成,分别是Controller的类型查找以及根据类型创建Controller实例. 在查询Controller的类 ...
 - Web API (四) 特性路由(Attribute Route)
		
特性路由 是Web API 2 中提出的一种新的类型的路由,正如其名称那样,它是通过特性(Attribute) 来定义路由的,相比之前的基于模式(Convertion Based)的路由,特性路由 能 ...
 - MVC笔记--特性路由
		
物性路由:将路由和控制器放在一起,这样更简单方便,还可以处理复杂的路由场景 传统路由:集中.强制.基于代码风格来定义的. 每个MVC应用程序都需要路由来定义自己的处理请求方式,路由是MVC是应用程序的 ...
 
随机推荐
- 利用QPainter绘制各种图形(Shape, Pen 宽带,颜色,风格,Cap,Join,刷子)
			
利用QPainter绘制各种图形 Qt的二维图形引擎是基于QPainter类的.QPainter既可以绘制几何形状(点.线.矩形.椭圆.弧形.弦形.饼状图.多边形和贝塞尔曲线),也可以绘制像素映射.图 ...
 - [经典面试题]k节点一组旋转链表
			
[题目] 给出一个链表和一个数k,比方链表1→2→3→4→5→6.k=2,则翻转后2→1→4→3→6→5,若k=3,翻转后3→2→1→6→5→4,若k=4.翻转后4→3→2→1→5→6. 假设节点的数 ...
 - NSURLSession网络接口
			
URLSession URLSession NSURLSession是iOS7中新的网络接口,与NSURLConnection是并列的. 当程序在前台时,NSURLSession与NSURLConne ...
 - 小强的HTML5移动开发之路(34)——jQuery中的选择器
			
一.jQuery是什么? jQuery是由美国人John Resig创建,至今吸引了来自世界各地的众多javascript高手加入其中. jQuery的创始人和技术领袖,目前在Mozilla担任Jav ...
 - QT类库与Delphi VCL类库的体系结构对比——两者十分类似!
			
今天在看QT对象内存管理的一篇文章时:http://blog.csdn.net/dbzhang800/article/details/6300025想到了一个问题:就是QT类库体系结构与Delphi类 ...
 - 使用ant编译项目技能
			
ant编译时指定jdk的版本号 系统的jdk版本号是1.6,而项目使用的jdk版本号是1.5.所以在编译时须要指定jdk的版本号为1.5,能够使用以下的方法为javac 任务指定fork和execut ...
 - 在navicat上设置定时计划执行存储过程
			
原文 应用情景: 有一个存储过程,需要每天定时执行一次.所以在navicat上使用事件处理,当然还有其他的方法,这只是一种.作为参考 1.事件定义填写 2.事件计划设置 3.保存 点击上方保存即可 常 ...
 - git版本管理与github
			
1.下载并安装好git 里面有几个.exe的文件,需要用到的就是git-bash.exe 2.把git和github连接 1.打开github网站,点击最右上角的图标,点击setti ...
 - 机器审核图片学习(2)安装pornDetector所用环境-python、scikit-learn、opencv
			
1.安装python 下载安装即可:最好是C盘 路径:https://www.python.org/ 将Python的安装路径加到path环境变量中,Python/Scripts加到path环境变量 ...
 - mysql 权限命令
			
grant all on *.* to 'root' identified by 'root';