Web API-路由(一)
这一篇文章描述了ASP.NET API如何将HTTP请求路由到控制器。
如果你熟悉ASP.NET MVC,Web API路由和MVC路由非常相似,主要的不同地方是Web API使用HTTP方法,而不是URI路径去选择action。你也能够在WebAPI中使用MVC风格的路由,这一篇文章不讨论任何有关MVC的知识。
路由表:
在ASP.NET Web API 中,一个控制器是一个处理HTTP请求的类,Controller中的公共方法称作action方法或者简单方法,当Web API框架接收到一个请求,框架将请求路由到一个action。
Web API框架使用路由表(route table)来决定哪一个action被调用。VS的Web API 项目模版创建了一个默认的路由模版:
routes.MapHttpRoute(
name: "API Default",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
这个路由模版定义在 App_Start目录下的WebApiConfig.cs文件中。更多关于WebApiConfig的信息 可以看:Configuring ASP.NET Web API.
如果使用自寄宿(self-host)的Web API,必须通过HttpSelfHostConfiguration自己设置路由表,更多信息可以参考:Self-Host a Web API.
路由表中的每个条目包含一个模板,默认的Web API路由模版是“api/{controller}/{id}”。这个模版里,“api”是一个纯文本路径段,{controller}和{id}是占位符(参数变量)。当Web API框架接收到一个请求时,尝试将URI与路由表中的项(路由模版)匹配,如果没有可以匹配的路由项,则返回一个404错误,比如下面三个uri可以和默认的路由模版进行匹配。
/api/contacts
/api/contacts/1
/api/products/gizmo1
但是/contacts/1这个就匹配不了因为缺少“api"段。
注:Web API 路由模版使用“api”开头是为了避免与MVC的路由模版冲突,这样你能够使用"/contacts"URI去路由到一个MVC controller,而使用"api/contacts" 路由到一个Web API controller。当然,如果你不喜欢,可以修改默认的路由模版。
一旦找到匹配的路由,Web API则进行controller和action的选择:
--To find the controller, Web API adds "Controller" to the value of the {controller} variable.
--匹配action,Web API 查看本次HTTP 方法,比如:如果是GET方法,则在controller中查找Get开头的方法,这种查询以HTTP请求方式开头的action的方式只适合GET , POST , PUT 和 DELETE 方式Http请求???,你可以通过为action添加标识属性的方法来指定action可匹配的HTTP请求方式以及允许其他的HTTP请求方式。
--其他的路由模版中的占位符变量,比如{id},映射为一个action参数。
下面看一个例子:定义一个如下的controller
public class ProductsController : ApiController
{
public void GetAllProducts() { }
public IEnumerable<Product> GetProductById(int id) { }
public HttpResponseMessage DeleteProduct(int id){ }
}
下面表格展示了不同的URI所调用的action
|
HTTP Method |
URI Path |
Action |
参数 |
|
GET |
api/products |
GetAllProducts |
无 |
|
GET |
api/products/4 |
GetProductById |
4 |
|
DELETE |
api/products/4 |
DeleteProduct |
4 |
|
POST |
api/products |
没有匹配的action |
注意:这里的{id}段,如果指定了{id}的值,则调用有id参数的action方法 GetProductById。
因为没有定义Post开头的aciton方法,所以POST方式的请求找不到匹配的action。
路由拓展
--使用Http Methods 标识属性:除了定义以HTTP请求方式开头的action方法外,我们可以使用HttpGet , HttpPut , HttpPost 或者 HttpDelete标识属性来指定一个action方法匹配的HTTP请求方式(与使用HTTP请求方式开头的方法名效果一样),例如,下面这个方法可以和GET请求方式的HTTP请求匹配。
public class ProductsController : ApiController
{
[HttpGet]
public Product FindProduct(id) {}
}
如果一个action方法需要匹配多种HTTP请求方式,或者需要匹配除GET,POST,PUT,DELETE请求方式外的其他请求,可以使用AccptVerbs标识属性。例如:FindProduct方法可以同时匹配 GET 和 HEAD请求。
public class ProductsController : ApiController
{
[AcceptVerbs("GET", "HEAD")]
public Product FindProduct(id) { } // WebDAV method
[AcceptVerbs("MKCOL")]
public void MakeCollection() { }
}
--使用MVC风格的路由
定义路由模版:
routes.MapHttpRoute(
name: "ActionApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
在这个路由模版中,{action}参数指定controller中的action的名称,使用这种风格的路由,需要使用标识属性指定action允许匹配的HTTP请求方式,比如:必须使用[HttpGet]、[HttpPost]等标识属性。
public class ProductsController : ApiController
{
[HttpGet]
public string Details(int id);
}
上面的例子中一个“api/products/details/1”的GET请求,将映射到Details方法。这种风格很像MVC,可能更适合用在一个RPC-style API中。
--使用ActionName属性定义action的别名:
public class ProductsController : ApiController
{
[HttpGet]
[ActionName("Thumbnail")]
public HttpResponseMessage GetThumbnailImage(int id); [HttpPost]
[ActionName("Thumbnail")]
public void AddThumbnailImage(int id);
}
我们可以发送uri为 "api/products/thumbnail/id"的GET请求 map to GetThumbnailImage方法。
发送uri为"api/products/thumbnail/id"的POST请求 map to AddThumbnailImage 方法。
通过上面几个例子可以看出,可以使用标识属性,配置一个action方法用作匹配路由的名称和方法。
--使用[NonAction]标识属性来指定一个方法不为action方法。
Web API-路由(一)的更多相关文章
- ASP.NET Web API 路由对象介绍
ASP.NET Web API 路由对象介绍 前言 在ASP.NET.ASP.NET MVC和ASP.NET Web API这些框架中都会发现有路由的身影,它们的原理都差不多,只不过在不同的环境下作了 ...
- ASP.NET Web API路由系统:路由系统的几个核心类型
虽然ASP.NET Web API框架采用与ASP.NET MVC框架类似的管道式设计,但是ASP.NET Web API管道的核心部分(定义在程序集System.Web.Http.dll中)已经移除 ...
- ASP.NET Web API路由系统:Web Host下的URL路由
ASP.NET Web API提供了一个独立于执行环境的抽象化的HTTP请求处理管道,而ASP.NET Web API自身的路由系统也不依赖于ASP.NET路由系统,所以它可以采用不同的寄宿方式运行于 ...
- 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 ...
- ASP.NET Web API 路由
路由系统是请求消息进入ASP.NET Web API消息处理管道的第一道屏障,其根本目的是利用注册的路由表(RouteTable)对请求的URI进行解析以确定目标HttpController和Acti ...
- Web API路由与动作(三)
本章包括三个小节 如果你输入了mvc的路由规则 这个可以粗略过一遍即可 内容说明有点繁琐 原文地址:http://www.asp.net/web-api/overview/web-api-rout ...
- Asp.Net Web APi 路由的特点
在ASP.NET Web API中,路由是基于HTTP协议 GET请求路由到以GET开头的控制器方法,POST请求路由到以POST开头的控制器方法中,GET方法和GetProducts,都能与GET请 ...
- ASP.NET Web API 框架研究 ASP.NET Web API 路由
ASP.NET Web API 核心框架是一个独立的.抽象的消息处理管道,ASP.NET Web API有自己独立的路由系统,是消息处理管道的组成部分,其与ASP.NET路由系统有类似的设计,都能找到 ...
- 【转载】Asp .Net Web Api路由路径问题
原文章地址:https://www.cnblogs.com/devtester/p/8897302.html MVC也好,WebAPI也好,据我所知,有部分人是因为复杂的路由,而不想去学的.曾经见过一 ...
- ASP.NET Web API路由解析
前言 本篇文章比较长,仔细思考阅读下来大约需要15分钟,涉及类图有可能在手机显示不完整,可以切换电脑版阅读. 做.Net有好几年时间了从ASP.NET WebForm到ASP.NET MVC再到ASP ...
随机推荐
- org.hibernate.MappingException: Could not determine type for: java.util.List, at table: user, for...
异常详情: Caused by: org.hibernate.MappingException: Could not determine type for: java.util.List, at ta ...
- OpenGL【2 坐标转换】
// OpenGL.cpp : 自定义控制台应用程序的入口点. // #include "stdafx.h" #include<iostream> #include & ...
- SpringMVC源代码深度分析DispatcherServlet核心的控制器(初始化)
SpringMVC是非常优秀的MVC框架,每一个框架都是为了我们提高开发效率,我们试图通过对SpringMVC的源码去了解这个框架,了解整个设计思想,框架要有扩展性,这里用的比較多是接口和抽象,是框架 ...
- SpringAop进行日志管理。
在java开发中日志的管理有非常多种.我通常会使用过滤器,或者是Spring的拦截器进行日志的处理.假设是用过滤器比較简单,仅仅要对全部的.do提交进行拦截,然后获取action的提交路径就能够获取对 ...
- C#版的抓包软件
C#版的抓包软件 [创建时间:2015-09-10 22:37:04] NetAnalyzer下载地址 不好意思啊,NetAnalyzer停更有点长了,今天继续填坑^&^ NetAnaly ...
- Android变化如何破解几场金
我们在玩游戏的总会遇到一些东西需要购买,但是,我们可能要花钱,那么我们应该怎么办呢?这与游戏的插.我们在这里谈论的Android游戏,搜索互联网上的移动端游戏插件,您可能会发现一个叫段:八门神器.ap ...
- SAE+Java+jetty
SAE的java执行环境jetty如servlet该容器,和开放几乎完全访问.有效支持各种jar包.但对于jdk的要件的版本号是非常严格格,这里的版本号是jdk1.6 SAE利用上传war该方式配置j ...
- Android游戏开发研究帧动画实现
1.动画的原则框架 帧的动画帧的动画顾名思义,画就是帧动画. 帧动画和我们小时候看的动画片的原理是一样的,在同样区域高速切换图片给人们呈现一种视觉的假象感觉像是在播放动画,事实上只 ...
- 虚拟化(一):虚拟化和vmware产品描述
由于公司最近取得了虚拟化监控,因此,我们需要虚拟化的认识,总结学习,对于虚拟化的概念.从百度百科,例如下列: 虚拟化.是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机.在一台计算机上 ...
- 安德鲁斯 建立与各种听众自己定义的ScrollView
=== 建立与各种听众自己定义的ScrollView === 尽管安卓5.1已经release, 可是ScrollView的封装和对外API依然少的可怜, 尽管它优化得非常好了. 所以问题来了: Sc ...