第一节:WebApi的纯原生态的RestFul风格接口和路由规则介绍
一. 原生态接口
1. 从默认路由开始分析
在WebApiConfig.cs类中的Register方法中,我们可以看到默认路由如下:

分析:请求地址在 controller 前面需要加上 api/,controller后面没有action,最后有一个参数{id},webapi默认的路由规则就是一种RestFul风格的接口调用规则。
2. WebApi的默认调用规则
(1). 方法名默认为Get或者GetXXX开头的只接受get请求,默认为Post或者PostXXX开头的只接受Post请求,如果标注[HttpGet]、[HttpPost]等特性的话,则以特性为主。
(2). 不以GetXX或者PostXX等特殊开通的通过标注[HttpGet]等特性,也可以进行访问, 比如下面的UserInfor方法,通过添加[HttpGet]特性,就可以进行Get访问了。
PS:其它特殊的调用接受规则,详见下一节。
3. 实战测试
前提:以下所有的Action,都位于FirstController下,路由规则使用的是WebApi的默认路由规则。
(1).无参Get方法

请求方式:Get请求,请求地址:http://localhost:2131/api/First
(2).有参数的Get方法,参数名为int id

请求方式:Get请求,请求地址:http://localhost:2131/api/First/5 或者 http://localhost:2131/api/First/?id=5
分析:默认的路由规则:api/{controller}/{id},最后一个是 {id},而该方法的参数名也为id,所以可以 api/First/5 拼接,如果这里路由规则为:api/{controller}/{id2},方法的参数名必须为 int id2,才可以 api/First/5 这样拼接。
(3). 有参数的Get方法,参数名为 int id2

分析:该方法和上述的Get(int id)不能共存,因为不满足重载规范,该方法只能通过 api/First?id2=111 的模式进行Get请求,不能通过api/First/2的模式进行请求,因为路由中最后一位是 {id}而不是{id2}。
(4). 有string参数的Get方法

请求方式:Get请求,请求地址分别为:http://localhost:2131/api/First/?userName=5 、http://localhost:2131/api/First/?str=5
(5). 多个参数且不以Get开头,标注[HttpGet]特性

请求方式:Get请求,请求地址为:http://localhost:2131/api/First/?id=5&name=ypf
(6). 带一个参数的Post请求

请求方式如下:

(7). 带一个参数的Delete请求

请求方式:Delete 请求地址:http://localhost:2131/api/First/?id=5 或者 http://localhost:2131/api/First/5
(8). 带一个参数的Put请求

存在问题:postman请求,服务器端拿不到value的值。?? 稍后解决
二. 路由规则
1. 简介:
WebApi有两种路由规则,默认路由和特性路由,都位于WebApiConfig类中的Register方法里进行配置,
(1). config.MapHttpAttributeRoutes(); 代表特性路由
(2). config.Routes.MapHttpRoute(); 代表统一的默认路由
特别注意:特性路由的优先级 大于 默认路由的优先级
2. 默认路由
WebApi的默认路由为:routeTemplate: "api/{controller}/{id}",不含action,且最后一个参数名为id,只有参数名为id的时候才可以通过api/xxx/1 这种方式进行访问。
默认路由可以同时声明多个,只要里面的name值不一样即可,满足任何一个路由规则都可以访问。
演示:增加两个路由,名字分别为:DefaultApi2和DefaultApi3,下面的GetUseName方法,通过这两个路由规则: api2/Third/GetUserName?userName=1234 或者 api3/Third/GetUserName?userName=1234 都可以访问
(PS:需要注释掉相关的:[RoutePrefix]和[Route])

服务器端代码:

3. 特性路由
(1). 可以通过[Route]和[RoutePrefix]这两个标记来自定义路由规则,[Route]作用于action,[RoutePrefix]作用于Controller, 一旦设置了其中任何一个,默认路由routeTemplate就不起任何作用了。
(2). 当[RoutePrefix]和[Route]都存在的话,规则为二者的拼接结合,先[RoutePrefix] 后[Route]
案例测试
A:下面的GetM1(string userName)方法,增加特性: [Route("myApi/Third/GetM1")],注视掉控制器上的[RoutePrefix]特性,保留默认路由DefaultApi2和DefaultApi3, 则该方法需要通过:http://localhost:2131/myApi/Third/GetM1?userName=1234 进行访问。
B:下面的GetM2(string userName)方法,增加特性: [Route("myApi/Third/GetM2")],控制器上增加[RoutePrefix("ypfApi/Third")],保留默认路由DefaultApi2和DefaultApi3, 则该方法需要通过:http://localhost:2131/ypfApi/Third/myApi/Second/GetM2?userName=1234 进行访问。
C:下面的GetFullName(string firstName,string lastName)方法,增加特性: [Route("myApi/Third/GetFullName/{firstName}/{lastName}")],注视掉控制器上的[RoutePrefix]特性, 保留默认路由DefaultApi2和DefaultApi3。
则该方法可以通过:http://localhost:2131/myApi/Third/GetFullName/姚/大宝 进行访问
    //[RoutePrefix("ypfApi/Third")]
     public class ThirdController : ApiController
     {
         /// <summary>
         /// 演示多个默认路由的情况
         /// 需要把控制器的特性注释掉!需要把WebApiConfig中的 DefaultApi2和DefaultApi3两个路由打开,其他的都注释掉
         /// </summary>
         /// <param name="userName"></param>
         /// <returns></returns>
         [HttpGet]
         public string GetUserName(string userName)
         {
             return $"userName的值为{userName}";
         }
         /// <summary>
         /// 演示淡出的[Route]特性
         /// </summary>
         /// <param name="userName"></param>
         /// <returns></returns>
         [Route("myApi/Third/GetM1")]
         [HttpGet]
         public string GetM1(string userName)
         {
             return $"GetM1您的返回值为:{userName}";
         }
         /// <summary>
         /// 演示[RoutePrefix]和[Route]
         /// </summary>
         /// <param name="userName"></param>
         /// <returns></returns>
         [Route("myApi/Third/GetM2")]
         [HttpGet]
         public string GetM2(string userName)
         {
             return $"GetM2您的返回值为:{userName}";
         }
         /// <summary>
         /// 演示自定义[Route]的特殊写法
         /// </summary>
         /// <param name="firstName"></param>
         /// <param name="lastName"></param>
         /// <returns></returns>
         [Route("myApi/Third/GetFullName/{firstName}/{lastName}")]
         [HttpGet]
         public string GetFullName(string firstName,string lastName)
         {
             return $"firstName值为{firstName},lastName值为{lastName}";
         }
     }
5. 特性路由的作用
(1). 标记特殊的访问路径,该功能有点鸡肋,用的比较少。
(2). 多版本控制的时候会使用. (后面介绍)
!
- 作 者 : Yaopengfei(姚鹏飞)
 - 博客地址 : http://www.cnblogs.com/yaopengfei/
 - 声 明1 : 本人才疏学浅,用郭德纲的话说“我是一个小学生”,如有错误,欢迎讨论,请勿谩骂^_^。
 - 声 明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
 
第一节:WebApi的纯原生态的RestFul风格接口和路由规则介绍的更多相关文章
- SpringBoot2.0基础案例(01):环境搭建和RestFul风格接口
		
一.SpringBoot 框架的特点 1.SpringBoot2.0 特点 1)SpringBoot继承了Spring优秀的基因,上手难度小 2)简化配置,提供各种默认配置来简化项目配置 3)内嵌式容 ...
 - 『政善治』Postman工具 — 3、补充:restful风格接口的项目说明
		
目录 (一)RESTful架构风格特点 1.统一接口风格 2.规范的HTTP请求方法 3.HTTP响应码 4.什么是无状态 (二)JSON数据格式说明 1.什么是JSON 2.JSON格式的特点 3. ...
 - 使用SpringBoot编写Restful风格接口
		
一.简介 Restful是一种对url进行规范的编码风格,通常一个网址对应一个资源,访问形式类似http://xxx.com/xx/{id}/{id}. 举个栗子,当我们在某购物网站上买手机时会 ...
 - restful风格接口和spring的运用
		
Restful风格的API是一种软件架构风格,设计风格而不是标准,只是提供了一组设计原则和约束条件.它主要用于客户端和服务器交互类的软件.基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机 ...
 - thinkphp5.0极速搭建restful风格接口层实例
		
作为国内最流行的php框架thinkphp,很快就会发布v5.0正式版了,现在还是rc4版本,但已经很强大了下面是基于ThinkPHP V5.0 RC4框架,以restful风格完成的新闻查询(get ...
 - Restful风格接口浅析
		
为什么使用RESTful1.JSP技术可以让我们在页面中嵌入Java代码,但是这样的技术实际上限制了我们的开发效率,因为需要我们Java工程师将html转换为jsp页面,并写一些脚本代码,或者前端代码 ...
 - 第一节:从面向对象思想(oo)开发、接口、抽象类以及二者比较
		
一. 面向对象思想 1. 面向过程(OP)和面向对象(OO)的区别: (1):面向过程就是排着用最简单的代码一步一步写下去,没有封装,当业务复杂的时候,改动就很麻烦了 (2):面向对象将复杂的业务分离 ...
 - RestFul风格接口示例
		
REST是英文representational state transfer(表象性状态转变)或者表述性状态转移;Rest是web服务的一种架构风格;使用HTTP,URI,XML,JSON,HTML等 ...
 - 【Spring】构建Springboot项目 实现restful风格接口
		
项目代码如下: package hello; import org.springframework.boot.SpringApplication; import org.springframework ...
 
随机推荐
- LeetCode算法题-Distribute Candies(Java实现)
			
这是悦乐书的第266次更新,第279篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第133题(顺位题号是575).给定具有偶数长度的整数数组,其中该数组中的不同数字表示不 ...
 - Python开发【前端篇】CSS
			
1.css基本语法及页面引用 css基本语法 css的定义方法是: 选择器 { 属性:值; 属性:值; 属性:值;} 选择器是将样式和页面元素关联起来的名称,属性是希望设置的样式属性每个属性有一个或多 ...
 - Python开发【字符串格式化篇】
			
1.百分号 __author__ = "Tang" # + 号 拼接 msg = "i am " + " tang" print(msg) ...
 - android的listview以及画线--to thi tha
			
https://www.cnblogs.com/896240130Master/p/6135165.html 这个的 https://www.jianshu.com/p/5522470760c1
 - Vue 自定义一个插件的用法、小案例及在项目中的应用
			
1.开发插件 install有两个参数,第一个是Vue构造器,第二个参数是一个可选的选项对象 MyPlugin.install = function (Vue, options) { // 1 ...
 - loc iloc函数的区别
			
import pandas as pd data1 = pd.read_excel(r"G:\Python\example1.xlsx") loc 用行列标签,iloc用数字索引. ...
 - Golang 入门系列(三)Go语言基础知识汇总
			
前面已经了 Go 环境的配置和初学Go时,容易遇到的坑,大家可以请查看前面的文章 https://www.cnblogs.com/zhangweizhong/category/1275863.html ...
 - CF1120D Power Tree
			
沙发~~ 题意简述 给你一棵有根树,定义叶子为度数为1的点. 你可以以$ w_x \(的代价控制\)x\(点.选择控制之后可以给它的子树里的叶子加 上\)t (t \in Z )$. 你要以最小的总代 ...
 - Java 200+ 面试题补充 ThreadLocal 模块
			
让我们每天都有进步,老王带你打造最全的 Java 面试清单,认真把一件事做到极致. 本文是前文<Java 最常见的 200+ 面试题>的第一个补充模块. 1.ThreadLocal 是什么 ...
 - Laravel 和 Spring Boot 两个框架比较创业篇(二:人工成本)
			
前面从开发效率比较了 Laravel 和 Spring Boot两个框架,见:Laravel 和 Spring Boot 两个框架比较创业篇(一:开发效率) ,这一篇打算比较一下人工成本. 本文说的人 ...