Web API之路由浅谈
Web API的路由,是指明接口地址的方向,是照亮获取数据路上的灯塔,其重要性不言而喻。
本篇文章以vs2015为例,一步步说明路由的创建及使用,其中包括默认路由、自定义路由和特性路由。
一、默认路由
我们创建一个新的web api项目,其初始的默认路由是这样的:
不难看出,默认路由的名称(name)是DefaultApi。路由模板(routeTemplate)是api/{controller}{id},api是固定的,{controller}匹配控制器,{id}匹配行为的参数,由defaults可以看出,id这个路由参数值可以自定义,也就是说,id值可以有或者没有。只要客户端传进来的url地址匹配该路由,就能找到对应的action并执行之。
接下来新建一个model类Product,新建一个控制器ProductsController。
我们的controller控制器内容为:
这时,我们用到的路由全是创建初期默认的路由。那么,当客户端访问进来时,路由怎么去匹配相关的action呢?这时,可以取一个巧:如果客户端是以GET请求的,但是web api的action方法没有指明http的动词(httpget/httppost等等之类的),那么路由便会去匹配以Get字符串开头命名的action方法,再去匹配请求参数相同的action方法,其他诸如post/delete/put等请求都是相同的原理。
就拿GetAllProducts()这个action方法举例。
1、浏览器输入http://localhost:8026/api/products
2、路由匹配到GetAllProducts方法
是不是很简单!api是固定的,products是控制器名称,url后面没有跟参数,而且客户端是以Get方式提交到后台的,所以路由就自动匹配到了。
以上讲解的是没有给控制器的action方法指定客户端提交方式,路由会自动去按照action名称所包含的字符串去匹配。其实,我们还可以给action方法指定这些http动词。如:
从上图可以看出,客户端可以通过GET或POST方式请求GetAllProducts这个操作的结果。但是,只能通过GET的方式请求GetProductById这个操作的结果,如果是以POST方式提交的话,服务器会返回{"Message":"The requested resource does not support http method 'POST'."}
二、自定义路由
可以在WebApiConfig.cs的Register方法中设置自定义路由匹配规则。如:
这时,我们在客户端以Get方式提交一个url地址:http://localhost:8026/ActApi/Products/GetProductById/1,自定义路由会将该地址匹配并对应到GetProductById()方法。首先ActApi是固定的,Products是controller控制器名称,GetProductById是一个action方法名称,1是这个action方法的参数。其实,使用默认路由的http://localhost:8026/Api/Products/1这个地址也能访问到该方法。
需要注意:每个路由的名称name都不能相同。在路由模板中,控制器的匹配字符串{controller}和参数的匹配字符串(例如:{id})一定要写进去。
根据以上两种路由来看,当一个请求到来之时,路由做的工作如下步骤所示:
1、首先匹配固定字符串;
2、其次匹配相关控制器;
3、然后匹配控制器中的action方法,通过http提交方式之类的;
4、最后根据action方法的参数去匹配。首先匹配没有参数的,如果失败,则去匹配参数类型一致的,如果找到多条记录,则返回Multiple controller types were found that match the URL这个错误说明,如果没有找到,则返回not found错误说明,如果匹配到一个action方法,那么就是它了,真的是蓦然回首,那action特么却在黑灯瞎火处,真尼玛难找!
三、特性路由
如果需要使用特性路由,需要在WebApiConfig.cs的Register方法中加入config.MapHttpAttributeRoutes()这行代码。如:
然后,我们就可以在控制器中使用特性路由。如:
通过特性的方式,使用RoutePrefix给控制器加上路由前缀,使用Route给每个action加上路由。这样,客户端可以通过具体的路由找到具体的action。比如http://localhost:8026/Products/1这个地址,通过特性路由,可以匹配到GetProductById这个action方法;http://localhost:8026/Products/Hardware这个地址可以匹配到GetProductsByCategory方法。
特别注意:如果一个action方法被设置了特性路由,那么默认路由和自定义路由就会被作废,只能通过特性路由去匹配到该action方法。
举个例子,控制器中某两个action方法如下图定义:
GetAllProducts:该方法没有定义特性路由,可以通过默认路由或自定义路由去访问该action方法。如:http://localhost:8026/api/products 或 http://localhost:8026/ActApi/products/GetAllProducts ;
GetProductById:定义了特性路由,通过默认路由和自定义路由访问不到,只能通过特性路由去访问。如:http://localhost:8026/products 或 http://localhost:8026/products/1,其实这两个地址返回来的结果是相同的,因为该方法的Id参数默认的是1。
扩展两个技巧:ActionName和NoAction。
ActionName:可通过ActionName更改其指定action的方法名,客户端在请求的时候,以ActionName提供的为主。
NoAction:指定某个action方法不能被访问。
如下图:
Web API之路由浅谈的更多相关文章
- Web Api 的 路由机制
ASP.NET Web API 是一种框架,用于轻松构建可以访问多种客户端(包括浏览器和移动设备)的 HTTP 服务. ASP.NET Web API 是一种用于在 .NET Framework 上构 ...
- ASP.NET MVC , ASP.NET Web API 的路由系统与 ASP.NET 的路由系统是怎么衔接的?
ASP.NET MVC 的路由实际上是建立在 ASP.NET 的路由系统之上的. MVC 路由注册通常是这样的: RouteTable 是一个全局路由表, 它的 Routes 静态属性是一个 Ro ...
- Web Service进阶(七)浅谈SOAP Webservice和RESTful Webservice
浅谈SOAP Webservice和RESTful Webservice REST是一种架构风格,其核心是面向资源,REST专门针对网络应用设计和开发方式,以降低开发的复杂性,提高系统的可伸缩性.RE ...
- 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编程——路由
路由过程大致分为三个阶段: 1)请求URI匹配已存在路由模板 2)选择控制器 3)选择操作 1匹配已存在的路由模板 路由模板 在WebApiConfig.Register方法中定义路由,例如模板默认生 ...
- ASP.NET WEB API 特性路由
一.什么是特性路由? 特性路由是指将RouteAttribute或自定义继承自RouteAttribute的特性类标记在控制器或ACTION上,同时指定路由Url字符串,从而实现路由映射,相比之前的通 ...
- 从Angular2路由引发的前后端路由浅谈
笔者的学习进度比较慢,直到两年以前写的网站都还是以服务端为主导的,即网站的所有视图都由服务器视图模板来渲染,笔者使用的是 DotNet MVC,开发套路就是在Controller里面写Action,在 ...
随机推荐
- Codeforces 600 E - Lomsat gelral
E - Lomsat gelral 思路1: 树上启发式合并 代码: #include<bits/stdc++.h> using namespace std; #define fi fir ...
- C#接口实现技巧之借助第三方
一个类继承了一个接口,对接口实现通常的做法---直接在这个类中对接口进行实现. 利用继承的概念,可以很巧妙地借助第三方类对接口进行实现,这种方式在实际的项目开发过程中其实用途很是比较大的,至少我们的游 ...
- 如何知道我 的python是32位还是64位的?
方法一: 打开IDLE,看第一行提示,例如: 32位系统是这样的 Python 3.5.1 (v3.5.1:37a07cee5969, Dec 6 2015, 01:38:48) [MSC v.19 ...
- 七种常见的核酸序列蛋白编码能力预测工具 | ncRNAs | lncRNA
注:这些工具的应用都是受限的,有些本来就是只能用于预测动物,在使用之前务必用ground truth数据来测试一些.我想预测某一个植物的转录本,所以可以拿已经注释得比较好的拟南芥来测试一下.(测试的结 ...
- Linux ----> debian中环境的常见配置
环境: (debian 9)/(lubuntu18.0.4+virtualbox) 1.配置下载源: gedit /etc/apt/sources.list #163 deb http://mirro ...
- 结合canvas和jquery.Jcrop.js裁切图像上传图片
1.引入的外部资源: jquery.Jcrop.css.jquery.Jcrop.js.upimg.js 2.使用的页面元素 @* 选择照片 *@ <div class="line&q ...
- centos6 安装python3.5后pip无法使用的处理
现象:安装pip后发现命令无法识别command not found 原因:which查看找到不到执行路径 find搜索发现安装后存放在/usr/local/python3.5/bin下,于是判断 ...
- thinkphp 中MVC思想
ThinkPHP5.0应用基于MVC(模型-视图-控制器)的方式来组织. MVC是一个设计模式,它强制性的使应用程序的输入.处理和输出分开.使用MVC应用程序被分成三个核心部件:模型(M).视图(V) ...
- http认证中的nonce与timestamp解释
Nonce是由服务器生成的一个随机数,在客户端第一次请求页面时将其发回客户端:客户端拿到这个Nonce,将其与用户密码串联在一起并进行非可逆加密(MD5.SHA1等等),然后将这个加密后的字符串和用户 ...
- hdu5608杜教筛
题意:给定函数\(f(x)\),有\(n^2-3*n+2=\sum_{d|n}f(d)\),求\(\sum_{i=1}^nf(i)\) 题解:很显然的杜教筛,假设\(g(n)=n^2-3*n+2\), ...