一. 原生态接口

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风格接口和路由规则介绍的更多相关文章

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

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

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

    目录 (一)RESTful架构风格特点 1.统一接口风格 2.规范的HTTP请求方法 3.HTTP响应码 4.什么是无状态 (二)JSON数据格式说明 1.什么是JSON 2.JSON格式的特点 3. ...

  3. 使用SpringBoot编写Restful风格接口

    一.简介    Restful是一种对url进行规范的编码风格,通常一个网址对应一个资源,访问形式类似http://xxx.com/xx/{id}/{id}. 举个栗子,当我们在某购物网站上买手机时会 ...

  4. restful风格接口和spring的运用

    Restful风格的API是一种软件架构风格,设计风格而不是标准,只是提供了一组设计原则和约束条件.它主要用于客户端和服务器交互类的软件.基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机 ...

  5. thinkphp5.0极速搭建restful风格接口层实例

    作为国内最流行的php框架thinkphp,很快就会发布v5.0正式版了,现在还是rc4版本,但已经很强大了下面是基于ThinkPHP V5.0 RC4框架,以restful风格完成的新闻查询(get ...

  6. Restful风格接口浅析

    为什么使用RESTful1.JSP技术可以让我们在页面中嵌入Java代码,但是这样的技术实际上限制了我们的开发效率,因为需要我们Java工程师将html转换为jsp页面,并写一些脚本代码,或者前端代码 ...

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

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

  8. RestFul风格接口示例

    REST是英文representational state transfer(表象性状态转变)或者表述性状态转移;Rest是web服务的一种架构风格;使用HTTP,URI,XML,JSON,HTML等 ...

  9. 【Spring】构建Springboot项目 实现restful风格接口

    项目代码如下: package hello; import org.springframework.boot.SpringApplication; import org.springframework ...

随机推荐

  1. VMware虚拟机系统无法使用桥接联网

    1.环境 VMware 14.1.1 虚拟系统:Windows Server 2008 32位 2.解决办法 打开虚拟网络编辑器 有红框中的提示出现时,就点击更改设置 点击桥接模式,在VMnet信息中 ...

  2. Java开发学习心得(一):SSM环境搭建

    目录 Java开发学习心得(一):SSM环境搭建 1 SSM框架 1.1 Spring Framework 1.2 Spring MVC Java开发学习心得(一):SSM环境搭建 有一点.NET的开 ...

  3. 通过指令码来判断Java代码的执行顺序(++问题与return和finally的问题)

    问题 在<深入理解Java虚拟机>一书中遇到了如下代码: public int method() { int i; try { i = 1; return i; } catch (Exce ...

  4. day19-网络编程基础(二)

    今天没有很多概念性的东西,主要是方法性的东西以及编程的一些方法吧 今日份目录 1.UDP传输的特点以及实验 2.UTP与UDP传输的区别 3.基于tcp的low版带验证功能的FTP小程序 4.基于so ...

  5. Linux:Day12(上) 进程

    内核的功用:进程管理.文件系统.网络功能.内存管理.驱动程序.安全功能 Process:运行中的程序的一个副本. 存在生命周期 Linux内核存储进程信息的固定格式 :task struct 多个任务 ...

  6. Linux实战教学笔记51:Zabbix监控平台3.2.4(三)生产环境案例

    https://www.cnblogs.com/chensiqiqi/p/9162986.html 一,Zabbix生产环境监测案例概述 1.1 项目规划 [x] :主机分组 交换机 Nginx To ...

  7. UI Automator 常用 API 整理

    主要类: import android.support.test.uiautomator.UiDevice; 作用:设备封装类,测试过程中获取设备信息和设备交互. import android.sup ...

  8. STM32F103/429串口IAP+Ymodem升级

    起因: 串口IAP升级在正点原子的例程中有讲解,正点原子的方法是:在RAM中开辟一个120K的数据空间,用来存放bin文件,bin文件通过串口一次性发送到单片机,然后再实现程序的跳转.但是这种方法在实 ...

  9. 关于JavaScript闭包的粗浅理解

    在JavaScript中,使用var创建变量,会创建全局变量或局部变量. 只有在非函数内创建的变量,才是全局变量,该变量可以在任何地方被读取. 而在函数内创建变量时,只有在函数内部才可读取.在函数外部 ...

  10. Leetcode 88. Merge Sorted Array(easy)

    Given two sorted integer arrays nums1 and nums2, merge nums2 into nums1 as one sorted array. Note:Yo ...