一. 原生态接口

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/姚/大宝 进行访问

 1    //[RoutePrefix("ypfApi/Third")]2     public class ThirdController : ApiController3     {4         /// <summary>5         /// 演示多个默认路由的情况6         /// 需要把控制器的特性注释掉!需要把WebApiConfig中的 DefaultApi2和DefaultApi3两个路由打开,其他的都注释掉7         /// </summary>8         /// <param name="userName"></param>9         /// <returns></returns>
10         [HttpGet]
11         public string GetUserName(string userName)
12         {
13             return $"userName的值为{userName}";
14         }
15
16         /// <summary>
17         /// 演示淡出的[Route]特性
18         /// </summary>
19         /// <param name="userName"></param>
20         /// <returns></returns>
21         [Route("myApi/Third/GetM1")]
22         [HttpGet]
23         public string GetM1(string userName)
24         {
25             return $"GetM1您的返回值为:{userName}";
26         }
27
28         /// <summary>
29         /// 演示[RoutePrefix]和[Route]
30         /// </summary>
31         /// <param name="userName"></param>
32         /// <returns></returns>
33         [Route("myApi/Third/GetM2")]
34         [HttpGet]
35         public string GetM2(string userName)
36         {
37             return $"GetM2您的返回值为:{userName}";
38         }
39
40         /// <summary>
41         /// 演示自定义[Route]的特殊写法
42         /// </summary>
43         /// <param name="firstName"></param>
44         /// <param name="lastName"></param>
45         /// <returns></returns>
46         [Route("myApi/Third/GetFullName/{firstName}/{lastName}")]
47         [HttpGet]
48         public string GetFullName(string firstName,string lastName)
49         {
50             return $"firstName值为{firstName},lastName值为{lastName}";
51         }
52
53     }

5. 特性路由的作用

(1). 标记特殊的访问路径,该功能有点鸡肋,用的比较少。

(2). 多版本控制的时候会使用. (后面介绍)

第一节:WebApi的纯原生态的RestFul风格接口和路由规则介绍相关推荐

  1. SpringBoot2.0基础案例(01):环境搭建和RestFul风格接口

    一.SpringBoot 框架的特点 SpringBoot2.0 特点 1)SpringBoot继承了Spring优秀的基因,上手难度小 2)简化配置,提供各种默认配置来简化项目配置 3)内嵌式容器简 ...

  2. 『政善治』Postman工具 — 3、补充:restful风格接口的项目说明

    补充:restful风格接口的项目说明 (一)RESTful架构风格特点 1.统一接口风格 http://服务器地址:端口号[/项目名称/版本/资源] http://:为我们HTTP协议的访问头标准. ...

  3. restapi如何传图片_如何设计restful风格接口

    restful风格接口 URL定位资源,用HTTP动词(GET,POST,DELETE,DETC)描述操作. 识别(identify). 表示(represent) .交互(interact with ...

  4. Java面试之RESTful风格接口

    1.Restful风格接口简介: 答:Restful这个词,是一个外国人Roy Thomas Fielding在2000年提出的.这个Fielding将他对互联网软件的架构原则,定名为REST,即Re ...

  5. 前端请求restful风格接口怎么传参_浅谈Restful API 的请求规范

    前言 在SpringMVC架构上进行开发,开发者一直在使用jsp.valocity或者其他页面模版作为表现层面,前端工程师需要将设计师的设计图转换为静态的html页面,然后交付给后端将静态的html页 ...

  6. 什么是Restful风格接口?

    写这篇文章的初衷是项目组的小伙伴不懂什么叫Restful. 1.定义:Restful风格的API是一种软件架构风格,设计风格而不是标准,只是提供了一组设计原则和约束条件.它主要用于客户端和服务器交互类 ...

  7. 第一节:从面向对象思想(oo)开发、接口、抽象类以及二者比较

    一. 面向对象思想 1. 面向过程(OP)和面向对象(OO)的区别: (1):面向过程就是排着用最简单的代码一步一步写下去,没有封装,当业务复杂的时候,改动就很麻烦了 (2):面向对象将复杂的业务分离 ...

  8. SSM8==纯注解SSM项目:实现单表CRUD、事务、自定义异常和统一异常处理、RESTFUL风格接口、统一返回值格式(状态码、内容、消息)、JSON传参、axios、vue.js、elementUI

    环境:IDEA2021+JDK8+MAVEN3.8+TOMCAT7插件 前端:axios.vue.js.elementUI 后端:见POM.XML相关依赖,主要有数据库MySQL5.7 ,数据源Dru ...

  9. boot spring 接口接收数据_基于 Spring Boot 实现 Restful 风格接口,实现增删改查功能...

    优质文章,及时送达 Spring Boot介绍 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.该框架使用了特定的方式来进行配 ...

最新文章

  1. 基于Matlab和Wind SQL数据库的通用选股策略回测程序
  2. UVA - 10048 Audiophobia(Floyd求路径上最大值的最小)
  3. 云服务器怎么拷贝和删除文件,怎样给云服务器拷贝文件
  4. Linux云服务器下Tomcat部署超详细
  5. 苏大微型计算机原理与应用题库,苏州大学计算机原理及应用考研复习题.pdf
  6. 编程语言的好坏,没那么重要?
  7. [数位dp] Jzoj P4239 光棍
  8. Android常用的简单代码
  9. Linux自学:常用删除命令(rm)使用方法
  10. 分享一个我常用的信息差赚钱渠道
  11. 大厂P5、P6、P7级程序员的简历长什么样?
  12. 互联网人吐槽互撕系列漫画 要来啦~
  13. 《计算机网络自顶向下》Wireshark实验 Lab11 802.11 WiFi
  14. R3 2200G搭配显卡推荐
  15. 大数据工程师是不是青春饭,程序员30岁以后的路怎么走
  16. CTPN-自然文本场景检测学习笔记
  17. 微信小程序:王者荣耀改名神器
  18. 深入浅出学Spring Data JPA toPredicate Predicate[] p = new Predicate[list.size()]; query.where(cb.and 201
  19. Access2003和2007/2010中这样执行SQL语句
  20. Maya 搭建PyCharm 插件开发环境

热门文章

  1. spring容器bean的作用域 spring容器是否是单例的一些问题
  2. [译]Javascript中的闭包(closures)
  3. 在latex或者mathtype中如何输入花体,如拉式量L
  4. Linux 输入子系统原理理解(原创)
  5. Microsoft SQL Server 2005数据库安装
  6. android滑动开关框架,Android之实现滑动开关组件
  7. 服务器测试文件怎么创建,如何创建一个“FTPS”模拟服务器以单元测试Java中的文件传输...
  8. php全局cors,PHP开启CORS - slagga的个人页面 - OSCHINA - 中文开源技术交流社区
  9. 从一个数组中找出最接近目标_LeetCode每日一题 | 转变数组后最接近目标值的数组和...
  10. 陇东学院c语言程序设计,C语言程序设计