ASP.NET WebApi 学习与实践系列(2)---WebApi 路由请求的理解
写在前面
上一篇,我已经写了如何快速的创建一个webapi项目。接下来,说一下webapi相关的路由请求吧。
我们来创建一个包含读/写操作的web api 2控制器。

我们仔细看这个初始的web api,我们会发现
1.在控制器的方法中,会默认一种格式的请求。而默认的则是Post请求。
2.在控制器的方法中,不会默认为Get请求。所以,需要请求数据时,需要加上前缀【HttpGet】。
3.在控制器的方法中,请求数据用Get请求,删除数据用Delete请求,添加数据用Post请求,编辑数据会用到Put请求。而它们所对应的前缀则分别是【HttpGet】,【HttpDelete】,【HttpPost】,【HttpPut】。
4.在控制器的方法中,我们会发现【FromBody】]这个属性。而它作用就是指定参数来自于外部请求。
需要注意的是:使用其传递参数,需要特定的格式。而这样的格式不是常见得Key=Value得键值对的形式。模型绑定器希望【FromBody】找到没有键名的值,也就是=value,不是Key=Value。
5.在控制器的方法中,还会有【FromUri】属性。它的作用就是指定参数来自url。
WebApi Get 请求
1.无参数的请求
前台页面
$.ajax({
    url: "../api/Home/GetData",
    type: "Get",
    datatype: "json",
    contentType: "application/json",
}).done(function (msg) {}).fail(function (e) {});
后台页面
public class DeviceStatus
{
      public int ID {get;set;}
      public string Power { get; set; }
      public string Mode { get; set; }
      public string Fan { get; set; }
      public int TempSet { get; set; }
      public string UpdateTime { get; set; }
}
public List<DeviceStatus> GetDeviceStatus()
 {
     var devi = new List<DeviceStatus> {
             new DeviceStatus{ID=1,Power="开",Mode="制冷",Fan="低",TempSet=10,UpdateTime="2019-08-01 17:00:00"},
             new DeviceStatus{ID=2,Power="关",Mode="制热",Fan="低",TempSet=20,UpdateTime="2019-08-02 17:00:00"},
             new DeviceStatus{ID=3,Power="开",Mode="除湿",Fan="高",TempSet=30,UpdateTime="2019-08-03 17:00:00"},
             new DeviceStatus{ID=4,Power="关",Mode="制热",Fan="中",TempSet=40,UpdateTime="2019-08-04 17:00:00"},
             new DeviceStatus{ID=4,Power="关",Mode="制热",Fan="高",TempSet=50,UpdateTime="2019-08-05 17:00:00"},
     };
     var temp = (from u in devi select u).ToList();
     return temp;
}
[HttpGet]
public IEnumerable<DeviceStatus> GetData()
{
     return GetDeviceStatus();
}
显示结果

2.一个参数的请求
前台页面请求
$.ajax({
    url: "../api/Home/GetOneParameter",
    type: "Get",
    datatype: "json",
    contentType: "application/json",
    data: { ID: 2 }
}).done(function (msg) {
    alert(JSON.stringify(msg));
}).fail(function (e) {
    alert("调用失败:"+e);
});
后台页面
public class DeviceStatus
{
      public int ID {get;set;}
      public string Power { get; set; }
      public string Mode { get; set; }
      public string Fan { get; set; }
      public int TempSet { get; set; }
      public string UpdateTime { get; set; }
}
public List<DeviceStatus> GetDeviceStatus()
 {
     var devi = new List<DeviceStatus> {
             new DeviceStatus{ID=1,Power="开",Mode="制冷",Fan="低",TempSet=10,UpdateTime="2019-08-01 17:00:00"},
             new DeviceStatus{ID=2,Power="关",Mode="制热",Fan="低",TempSet=20,UpdateTime="2019-08-02 17:00:00"},
             new DeviceStatus{ID=3,Power="开",Mode="除湿",Fan="高",TempSet=30,UpdateTime="2019-08-03 17:00:00"},
             new DeviceStatus{ID=4,Power="关",Mode="制热",Fan="中",TempSet=40,UpdateTime="2019-08-04 17:00:00"},
             new DeviceStatus{ID=4,Power="关",Mode="制热",Fan="高",TempSet=50,UpdateTime="2019-08-05 17:00:00"},
     };
     var temp = (from u in devi select u).ToList();
     return temp;
}
[HttpGet]
public IEnumerable<DeviceStatus> GetOneParameter([FromUri] int ID) {
     var devi = GetDeviceStatus();
     var temp = (from u in devi  where u.ID==ID  select u).ToList();
     return temp;
}
显示结果

3.多个参数的请求
前台页面请求
$.ajax({
    url: "../api/Home/GetManyParameter",
    type: "Get",
    datatype: "json",
    contentType: "application/json",
    data: { ID: 1, Power: "开", Mode: "制冷", Fan: "高", TempSet: 26 }
}).done(function () {}).fail(function (e) {});
后台页面程序
public class DeviceStatus
{
      public int ID {get;set;}
      public string Power { get; set; }
      public string Mode { get; set; }
      public string Fan { get; set; }
      public int TempSet { get; set; }
      public string UpdateTime { get; set; }
}
public List<DeviceStatus> GetDeviceStatus()
 {
     var devi = new List<DeviceStatus> {
             new DeviceStatus{ID=1,Power="开",Mode="制冷",Fan="低",TempSet=10,UpdateTime="2019-08-01 17:00:00"},
             new DeviceStatus{ID=2,Power="关",Mode="制热",Fan="低",TempSet=20,UpdateTime="2019-08-02 17:00:00"},
             new DeviceStatus{ID=3,Power="开",Mode="除湿",Fan="高",TempSet=30,UpdateTime="2019-08-03 17:00:00"},
             new DeviceStatus{ID=4,Power="关",Mode="制热",Fan="中",TempSet=40,UpdateTime="2019-08-04 17:00:00"},
             new DeviceStatus{ID=4,Power="关",Mode="制热",Fan="高",TempSet=50,UpdateTime="2019-08-05 17:00:00"},
     };
     var temp = (from u in devi select u).ToList();
     return temp;
}
[HttpGet]
public IEnumerable<string> GetManyParameter([FromUri] int ID, string Power, string Mode, string Fan, int TempSet) {
     return new string[] { "编号:"+ID.ToString(), "开机状态:"+Power, "工作模式:"+Mode, "风量:"+Fan, "温度:"+TempSet.ToString() };
}        
显示结果

4.实体参数的请求
前台页面
$.ajax({
    url: "../api/Home/GetManyParameterModel",
    type: "Get",
    datatype: "json",
    contentType: "application/json",
    data: { ID: 2, Power: "关", Mode: "制热", Fan: "中", TempSet: 35 }
}).done(function () {}).fail(function (e) {});
后台页面
public class DeviceStatus
{
      public int ID {get;set;}
      public string Power { get; set; }
      public string Mode { get; set; }
      public string Fan { get; set; }
      public int TempSet { get; set; }
      public string UpdateTime { get; set; }
}
public List<DeviceStatus> GetDeviceStatus()
 {
     var devi = new List<DeviceStatus> {
             new DeviceStatus{ID=1,Power="开",Mode="制冷",Fan="低",TempSet=10,UpdateTime="2019-08-01 17:00:00"},
             new DeviceStatus{ID=2,Power="关",Mode="制热",Fan="低",TempSet=20,UpdateTime="2019-08-02 17:00:00"},
             new DeviceStatus{ID=3,Power="开",Mode="除湿",Fan="高",TempSet=30,UpdateTime="2019-08-03 17:00:00"},
             new DeviceStatus{ID=4,Power="关",Mode="制热",Fan="中",TempSet=40,UpdateTime="2019-08-04 17:00:00"},
             new DeviceStatus{ID=4,Power="关",Mode="制热",Fan="高",TempSet=50,UpdateTime="2019-08-05 17:00:00"},
     };
     var temp = (from u in devi select u).ToList();
     return temp;
}
[HttpGet]
public IEnumerable<string> GetManyParameterModel([FromUri] DeviceStatus devi) {
    return new string[] { "编号:" + devi.ID.ToString(), "开机状态:" + devi.Power, "工作模式:" + devi.Mode, "风量:" + devi.Fan, "温度:" + devi.TempSet.ToString() };
}
显示结果

WebApi Post 请求
1.键值对请求
前台页面
$.ajax({
    url: "../api/Home/PostNoKeyValueParameter",
    type: "Post",
    data: { "": "1" }
}).done(function () {}).fail(function (e) {});
注意:键值对请求的时候需要把 datatype: "json"和contentType: "application/json"注释掉,否则后台接收不到数据库。
后台页面
[HttpPost]
public string PostNoKeyValueParameter([FromBody] int ID)
{
   return "接收编号是:" + ID;
}
显示结果

2.dynamic 动态类型请求
前台页面请求
$.ajax({
    url: "../api/Home/PostDynamicValueParameter",
    type: "Post",
    data: { "": "2" }
}).done(function () {}).fail(function (e) {});
后台页面
[HttpPost]
public string PostDynamicValueParameter([FromBody] dynamic ID)
{
    return "接收编号是:" + ID;
}
显示结果

3.JObject 参数请求
前台页面
var devi = { ID: 2, Power: "关", Mode: "制热", Fan: "中", TempSet: 35 };
$.ajax({
    url: "../api/Home/PostJObjectValueParameter",
    type: "Post",
    dataType: "json",
    contentType: "application/json",
    data: JSON.stringify(devi)
}).done(function (msg) { }).fail(function (e) { });
后台页面
[HttpPost]
public string PostJObjectValueParameter([FromBody] JObject data)
{
    return "接收编号是:" + data["ID"]+ "开机状态:" + data["Power"] + "工作模式:" + data["Mode"];
}
显示结果

4.实体类 请求
前台页面
var devi = { ID: 3, Power: "开", Mode: "制冷", Fan: "高", TempSet: 40 };
$.ajax({
    url: "../api/Home/PostModelValueParameter",
    type: "Post",
    dataType: "json",
    contentType: "application/json",
    data: JSON.stringify(devi)
}).done(function (msg) { }).fail(function (e) { });
后台页面
[HttpPost]
public string PostModelValueParameter([FromBody] DeviceStatus data)
{
    return "接收编号是:" + data.ID + ";开机状态:" + data.Power + ";工作模式:" + data.Mode + ";风量:" + data.Fan + ";温度:" + data.TempSet.ToString();
}
显示结果

文章出处:原文
ASP.NET WebApi 学习与实践系列(2)---WebApi 路由请求的理解的更多相关文章
- ASP.NET WebApi 学习与实践系列(1)---如何创建 WebApi
		
写在前面 最近在做一个app的时候发现需要写后台服务.所以,在考虑是使用webapi还是使用webserver来写这个后台服务的时候.爱纠结的我,最后还是选择了使用webapi来写这个后台服务. 原因 ...
 - .NET Core 微服务学习与实践系列文章目录索引(2019版)
		
参考网址: https://archy.blog.csdn.net/article/details/103659692 2018年,我开始学习和实践.NET Core,并开始了微服务的学习,以及通过各 ...
 - .NET Core微服务架构学习与实践系列文章索引目录
		
一.为啥要总结和收集这个系列? 今年从原来的Team里面被抽出来加入了新的Team,开始做Java微服务的开发工作,接触了Spring Boot, Spring Cloud等技术栈,对微服务这种架构有 ...
 - ASP.NET MVC学习笔记(一) 从路由开始创建mvc
		
之前一篇写一半发现版本太老了,是基于mvc2的. 两本参考书编写的顺序各方面都不太一样.决定重新写一篇. 我这篇文章基于mvc5,vs2015 参考书:Will保哥的ASP.NET MVC4开发指南 ...
 - ASP.NET MVC学习系列(二)-WebAPI请求
		
继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用Jquery 来发起异步请求实现 ...
 - ASP.NET MVC学习系列(二)-WebAPI请求(转)
		
转自:http://www.cnblogs.com/babycool/p/3922738.html 继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的g ...
 - [转]ASP.NET MVC学习系列(二)-WebAPI请求 传参
		
[转]ASP.NET MVC学习系列(二)-WebAPI请求 传参 本文转自:http://www.cnblogs.com/babycool/p/3922738.html ASP.NET MVC学习系 ...
 - ASP.NET MVC学习系列(二)-WebAPI请求 转载https://www.cnblogs.com/babycool/p/3922738.html
		
继续接着上文 ASP.NET MVC学习系列(一)-WebAPI初探 来看看对于一般前台页面发起的get和post请求,我们在Web API中要如何来处理. 这里我使用Jquery 来发起异步请求实现 ...
 - .NET Core on K8S学习实践系列文章索引(Draft版)
		
一.关于这个系列 自从去年(2018年)底离开工作了3年的M公司加入X公司之后,开始了ASP.NET Core的实践,包括微服务架构与容器化等等.我们的实践是渐进的,当我们的微服务数量到了一定值时,发 ...
 
随机推荐
- quick player运行分析
			
mac应用从AppController.mm源文件的applicationDidFinishLaunching函数启动: . - (void)applicationDidFinishLaunching ...
 - 部署oVirt4.2+Gluster超融合架构
			
首先下载最新ovirt-node iso镜像 准备3台机器,配置为2核,16G内存,两块硬盘,1块100G装系统,1块300G做存储 node1.com(192.168.105.221) node2. ...
 - Mysql与Postgresql常用命令比较
			
PostgreSQL MySQL 服务启动:1)#service postgresql start2)#/etc/init.d/postgresql start3)#su – postgresql$p ...
 - 解决wordpress修改固定链接后出现404错误不能访问文章的方法
			
首先,建议大家安装完wordpress网站程序之后第一时间设置一下固定链接,避免以后修改出错.在wp后台仪表盘左侧导航里找到“设置——固定链接”即可配置你的wordpress固定链接,通常我习惯使用的 ...
 - 一条简单的 SQL 执行超过 1000ms,纳尼?
			
阅读本文大概需要 2.8 分钟. MySQL 对我说 “Too young, too naive!" ▌大概过程 在测试环境 Docker 容器中,在跨进程调用服务的时候,A 应用通过 Du ...
 - windows安装IIS不成功的原因
			
一.背景 之前做过一段时间的实施,因此总结一下IIS安装不成功会有哪些原因导致的,希望给踩坑的人提供思路和帮助. 二.分析原因 1.系统问题,比如Windows家庭版本(独白:我之前花了一天的时间安装 ...
 - 2018ECNA Difference[时空复杂度]
			
目录 题干 代码和解释 题干 代码和解释 本题给出一个数列的第一个数A(1),要求找出m第一次出现(直接出现在数列中或是数列中某两项的差的绝对值)在这个数列的第几步中.数列递推公式:A(n+1)=A( ...
 - Spring的注解收集
			
@Scope("prototype")spring 默认scope 是单例模式scope="prototype" 可以保证 当有请求的时候 都创建一个Actio ...
 - js中[object Object]与object.prototype.toString.call()
			
最近在用node读取文件中的json数据后,用JSON.parse()转成了json,然后响应数据传给前端,发现输出值object对象时显示[object object],在这里我们来看一下他的具体意 ...
 - Mapbox矢量瓦片标准(mapbox vector-tile-spec)
			
目录 1. 目标 2. 文件格式 2.1. 文件后缀 2.2 MIME类型 3. 投影和范围 4. 内部结构 4.1. 图层 4.2. 要素 4.3. 几何图形编码 4.4. 要素属性 4.5. 示例 ...