Web Api 的 路由机制
ASP.NET Web API 是一种框架,用于轻松构建可以访问多种客户端(包括浏览器和移动设备)的 HTTP 服务。 ASP.NET Web API 是一种用于在 .NET Framework 上构建 RESTful 应用程序的理想平台。
所以我们要想学习web api 就要去了解它的路由机制。MVC和web api的路由机制的主要区别是web api 使用的是http 方法而不是url 的路径。本文就演示一下web api 是怎样在controller 里映射 http 请求的。
web api 路由
在 web api 中 controller 是用来操作http 请求的。它里面的action 方法 对应不同的http 请求的方法。当 web api 收到一个http 请求的
时候 ,路由表就会将请求映射到对应的action 方法中。
路由表的定义是在 App_Start文件夹的WebApiConfig.cs类中,路由的定义其实和mvc 的差不多的。
public static void Register(HttpConfiguration config)
{
// Web API configuration and services // Web API routes
config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute(
name: "DefaultApi", //这个可以随意命名
routeTemplate: "api/{controller}/{id}",//web api 的地址
defaults: new { id = RouteParameter.Optional }
);
}
在 Global.asax 中注册 路由。
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas(); WebApiConfig.Register(GlobalConfiguration.Configuration);//注册 api 路由 必须写在mvc 路由注册之前否则会找不到。
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
}
当web api 框架收到http 请求的时候,它会尝试的去从路由表中的模板中匹配这个URL,如果不匹配将会显示404的错误。比如我们注册的这个模板就
会匹配一下的地址:
api/WebApi
api/WebApi/2222
api/Home/werwrwe
下面的就不会匹配,因为他们少了api/这个参数:
WebApi
WebApi/2222
Home/werwrwe
这个api/的参数是为了避免和mvc 的 路由有所冲突,当然你可以随意的去命名。
一旦请求的地址被匹配,web api 将会选择相对应controller 和 action
- 1,模板中的{controller}将对应请求地址中的controller。
- 2,web api 将会根据http 请求的方法来找到以这个方法的名字开头的 action ,比如说如果请求的是GET 方法,web api 就会找 以get 开头 action,getname getdata 等等。仅仅适用于 GET,POST,PUT,DELETE这四种方法。当然还可以设置其他的方法,需要在controller 上添加属性。
- 3,模板中的占位符比如{id} 用来匹配传进来的参数的。
比如 :
public class TestController : ApiController
{
public IEnumerable<TestModel> GetAllData() { }
public TestModel GetDataById(int id) { }
public HttpResponseMessage Delete(int id){ }
public HttpResponseMessage Post(TestModel test){}
public HttpResponseMessage Put(TestModel test){}
}
下面是每个http 请求对应的 action 方法:
Http 请求方法 | 对应的 action | url | 参数 | 操作 |
GET | GetAllData/GetDataById | api/webapi/1 | 1 | 获取 |
POST | Post | api/webapi | 添加 | |
DELETE | Delete | api/webapi | 删除 | |
PUT | Put | api/webapi | 更新 |
设置action 特性来接受http 请求
这个是接受get 请求的,action 的名字可以不用get 开头。
public class TestController : ApiController
{
[HttpGet]
public IEnumerable<TestModel> Find() { }
}
还可以接受那四个请求之外的http 请求或者多个请求:
public class TestController : ApiController
{
[AcceptVerbs("GET", "HEAD")]
public IEnumerable<TestModel> Find() { } [AcceptVerbs("MKCOL")]
public void Deatil() { }
}
我们还可以按照mvc 的方式来定义 web api 的模板,比如:
routes.MapHttpRoute(
name: "api",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
它就可以和api/test/find 相匹配。
我们还可以在action 上定义action 的名字:
public class TestController : ApiController
{
[AcceptVerbs("GET", "HEAD")]
[ActionName("test")]
public IEnumerable<TestModel> Find() { }
}
那么api/test/test 就可以进入上面的那个方法。
如果设置NoAction
public class TestController : ApiController
{ [NonAction]
public IEnumerable<TestModel> Find() { }
}
那么web api 就不会认为它是一个 action 即使与模板匹配也不会被调用。
Web Api 的 路由机制的更多相关文章
- Web API之路由浅谈
Web API的路由,是指明接口地址的方向,是照亮获取数据路上的灯塔,其重要性不言而喻. 本篇文章以vs2015为例,一步步说明路由的创建及使用,其中包括默认路由.自定义路由和特性路由. 一.默认路由 ...
- ASP.NET MVC , ASP.NET Web API 的路由系统与 ASP.NET 的路由系统是怎么衔接的?
ASP.NET MVC 的路由实际上是建立在 ASP.NET 的路由系统之上的. MVC 路由注册通常是这样的: RouteTable 是一个全局路由表, 它的 Routes 静态属性是一个 Ro ...
- ASP.NET Web API编程——路由
路由过程大致分为三个阶段: 1)请求URI匹配已存在路由模板 2)选择控制器 3)选择操作 1匹配已存在的路由模板 路由模板 在WebApiConfig.Register方法中定义路由,例如模板默认生 ...
- 2.3属性在 ASP.NET Web API 2 路由
路由是 Web API 如何匹配 URI 的行动.Web API 2 支持一种新型的路由,称为属性路由.顾名思义,属性路由使用属性来定义路由.属性路由给你更多的控制 Uri 在您的 web API.例 ...
- 2.4使用属性在 ASP.NET Web API 2 路由创建一个 REST API
Web API 2 支持一种新型的路由,称为属性路由.属性路由的一般概述,请参阅属性路由 Web API 2 中.在本教程中,您将使用属性路由创建一个 REST API 集合的书.API 将支持以下操 ...
- [翻译]ASP.NET Web API的路由
原文:Routing in ASP.NET Web API 在我们新建一个Web API项目时,会在App_Start文件夹下的WebApiConfig.cs中定义一个默认路由: config.Rou ...
- ASP.NET WEB API 特性路由
一.什么是特性路由? 特性路由是指将RouteAttribute或自定义继承自RouteAttribute的特性类标记在控制器或ACTION上,同时指定路由Url字符串,从而实现路由映射,相比之前的通 ...
- Web APi入门之Self-Host寄宿及路由原理(二)
前言 刚开始表面上感觉Web API内容似乎没什么,也就是返回JSON数据,事实上远非我所想,不去研究不知道,其中的水还是比较深,那又如何,一步一个脚印来学习都将迎刃而解. Self-Host 我们知 ...
- Asp.Net Web API 2第六课——Web API路由和动作选择
Asp.Net Web API 导航 Asp.Net Web API第一课——入门http://www.cnblogs.com/aehyok/p/3432158.html Asp.Net Web AP ...
随机推荐
- OpenStack安装部署(二)
中文文档:http://docs.openstack.org/mitaka/zh_CN/install-guide-rdo/提示:这个中文文档是直接翻译过来的,所以会有很多不通顺的地方. 服务介绍 M ...
- P2207 Photo
P2207 Photo 题目描述 Framer Jhon 打算给他的N头奶牛照相,( 2 <= N <= 1 000 000 000) . 他们排成一条线,并且依次取1~N作为编号. 每一 ...
- P1564 膜拜
P1564 膜拜 题目描述 神牛有很多-当然-每个同学都有自己衷心膜拜的神牛. 某学校有两位神牛,神牛甲和神牛乙.新入学的N 位同学们早已耳闻他们的神话. 所以,已经衷心地膜拜其中一位了.现在,老师要 ...
- Hadoop基础-HDFS数据清理过程之校验过程代码分析
Hadoop基础-HDFS数据清理过程之校验过程代码分析 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 想称为一名高级大数据开发工程师,不但需要了解hadoop内部的运行机制,还需 ...
- Elasticsearch5.2.0部署过程的坑
今天开工,在看ES时候发现前几天已经发布了5.2.0,就安装了一下,岂料安装完一直启动不了,可以说是一个bug. 报错: ERROR: bootstrap checks failed system c ...
- H5页面中唤起native app
现在各类app,分享出去的H5页面中,一般都会带着一个立即打开的按钮,如果本地安装了app,那么就直接唤起本地的app,如果没有安装,则跳转到下载.这是一个很正常的推广和导流量的策略,最近产品经理就提 ...
- Spring和springmvc父子容器注解扫描问题详解
一.Spring容器和springmvc容器的关系如下图所示: Spring和springmvc和作为两个独立的容器,会把扫描到的注解对象分别放到两个不同的容器中, Springmvc容器是spr ...
- bzoj千题计划123:bzoj1027: [JSOI2007]合金
http://www.lydsy.com/JudgeOnline/problem.php?id=1027 因为x+y+z=1,所以z=1-x-y 第三维可以忽略 将x,y 看做 平面上的点 简化问题: ...
- linux ln链接详解
1.序 Linux具有为一个文件起多个名字的功能,称为链接.被链接的文件可以存放在相同的目录下,但是必须有不同的文件名,而不用在硬盘上为同样的数据重复备份.另外,被链接的文件也可以有相同的文件名,但是 ...
- Git为某个域名设置代理
打开Git 配置文件 vi ~/.gitconfig 添加如下配置: [http "https://github.com/"] proxy = http://127.0.0.1:1 ...