博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# WebApi使用AttributeRoutes特性路由
阅读量:4964 次
发布时间:2019-06-12

本文共 4964 字,大约阅读时间需要 16 分钟。

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 0;        }    }}

其中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

转载于:https://www.cnblogs.com/TBW-Superhero/p/8625636.html

你可能感兴趣的文章
jenkins 离线安装插件 ,插件的下载地址
查看>>
Edit控件显示多行文字
查看>>
java 日期与时间类
查看>>
JS第二周
查看>>
杭电1217————不像最短路的"最短路"
查看>>
【iCore3双核心板】发布 iCore3 硬件手册!
查看>>
Leetcode Word Break
查看>>
css性质
查看>>
python数据结构
查看>>
正则指引-括号(3)反向引用
查看>>
android开发读书笔记
查看>>
Gitlab配置、备份、升级、迁移
查看>>
dataTable.NET的search box每輸入一個字母進行一次檢索的問題
查看>>
Python 文件处理
查看>>
邻接表详解
查看>>
android,radio,checkbox
查看>>
Steven-Java-变量
查看>>
Spring MVC 的概念1
查看>>
JAVA 上传图片功能
查看>>
编程中i++与++i的区别
查看>>