Web API(四):Web API参数绑定
在这篇文章中,我们将学习Web API如何将HTTP请求数据绑定到一个操作方法的参数中。
操作方法在Web API控制器中可以有一个或多个不同类型的参数。它可以是基本数据类型或复杂类型。Web API根据URL的查询字符串或请求主体中参数类型来绑定操作方法的参数。
如果参数类型是基本数据类型(int,double,string,DateTime,bool等),Web API默认将会从URL中获取参数值(即通过query string)获取。
如果参数类型的复杂类型,Web API默认从请求主体中获取参数值。
下表列出了Web API参数绑定的默认规则。
HTTP方法 | Query String | Request Body |
GET | 简单类型 | 不能从请求主体中获取参数值 |
POST | 简单类型 | 复杂类型 |
PUT | 简单类型 | 复杂类型 |
PATCH | 简单类型 | 复杂类型 |
DELETE | 简单类型 | 不能从请求主体中获取参数值 |
我们先来看看创建带MVC的Web API项目时自动生成的Values控制器是如何定义的。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http; namespace WebAPIContainMVC.Controllers
{
public class ValuesController : ApiController
{
// GET api/values
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
} // GET api/values/5
public string Get(int id)
{
return "value";
} // POST api/values
public void Post([FromBody]string value)
{
} // PUT api/values/5
public void Put(int id, [FromBody]string value)
{
} // DELETE api/values/5
public void Delete(int id)
{
}
}
}
从Values控制器的定义中,我们可以得出如下几个结论:
(1)Web API常规的方法有四个:Get(),Post(),Put()和Delete()。
(2)四种方法的参数可以归纳为两大类:URL传递(Request-url)和Body(Request-body)传递。
(3)可以将四种方法的参数传递归为两大类,而这两大类又集中在Get和Post中体现(Put是Get和Post的组合,Delete和Get类型),所以说研究Web API的参数绑定,只需要研究Get和Post方法的参数传递即可,Get对应Request-url,Post对应Request-Body。
在本篇文章中,客户端调用使用Fiddler工具进行测试。
一、Get
1、基本数据类型作为方法参数
1.1 方法只含有一个参数(形参可以传递进来)
方法定义如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using WebAPIContainMVC.Entity; namespace WebAPIContainMVC.Controllers
{
public class StudentController : ApiController
{
[HttpGet]
public string GetStudentById(int id)
{
string strResult=string.Empty;
List<Student> list = new List<Student>();
Student stu = new Student()
{
StudentId=,
Name="Tom",
Age=,
Sex="男"
};
list.Add(stu);
list.ForEach(p =>
{
if (p.StudentId.Equals(id))
{
strResult = "存在该学生信息";
}
else
{
strResult = "对不起,找不到该学生信息";
}
}); return strResult;
}
}
}
客户端调用
结果:
双击左侧的进程,得到如下的结果
1.2、方法含有多个参数(形参可以传递进来)
方法定义如下:
public string GetStudentByIdAndName(int id,string name)
{
string strResult = string.Empty;
List<Student> list = new List<Student>();
Student stu = new Student()
{
StudentId = 1,
Name = "Tom",
Age = 20,
Sex = "男"
};
list.Add(stu);
list.ForEach(p =>
{
if (p.StudentId.Equals(id)&&p.Name.Equals(name))
{
strResult = "存在该学生信息";
}
else
{
strResult = "对不起,找不到该学生信息";
}
}); return strResult;
}
URL地址:http://localhost:63512/api/student?id=1&&name=Tom
结果如下:
2、实体对象类型作为方法参数(形参不能传递进来)
方法定义如下:
[HttpGet]
public string GetStudent(Student student)
{
string strResult = string.Empty;
List<Student> list = new List<Student>();
Student stu = new Student()
{
StudentId = 1,
Name = "Tom",
Age = 20,
Sex = "男"
};
list.Add(stu);
if (student != null)
{
list.ForEach(p =>
{
if (p.StudentId.Equals(student.StudentId))
{
strResult = "存在该学生信息";
}
else
{
strResult = "对不起,找不到该学生信息";
}
});
}
else
{
strResult = "参数值为Null";
} return strResult;
}
客户端调用结果如下:
3、基本数据类型和实体对象混合作为方法参数(基本数据类型可以传递进来,实体对象不能传递进来)
4、总结
(1)查询字符串参数名称和操作方法参数名称必须相同(不区分大小写)。参数的先后顺序可以不一致。
(2)Get()参数传递的本质是URL字符串拼接,但是URL字符串的长度受限制。
(3)Get()的参数支持基本数据类型,不支持实体数据类型。
(4)Get()参数的传递是在Http请求的头部传递,而不支持Request-Body传递。
(5)Get类型的方法命名,尽量采用“Get+方法名”的命名方式,在方法前面加上特性:[HttpGet]。
二、Post
1、Post参数传递是在Request-Body内传递。
2、Post参数可以传递基本数据类型,也可以传递实体数据类型。
3、Post操作方法只能包含一个实体数据类型,因为只能允许一个参数读取Request-Body中的数据。
4、Post传递参数时,无论是基本类型参数还是实体类型,均需要借助[FromBody]特性。(有些情况下不写[FromBody]特性也可以把参数传递进来,但为了规范化,最好是加上该特性)。
5、Post类型的方法命名,尽量采用“Post+方法名”的命名方式,在方法前面加上特性:[HttpPost]。
三、FromURI与FromBody
在默认情况下,Web API是从查询字符串中得到基本数据类型参数的值,从请求主体中得到复杂类型参数的值,如果想改变这种默认情况怎么办?
可以使用[FromURI]属性,是Web API从查询字符串中获取复杂类型参数的值,使用[FromBody]属性可以使Web API从请求主体中获取基本数据类型参数的值。
例如下面的Get方法
[HttpGet]
public string GetStudentById([FromUri]Student stu)
{ }
Get方法中包括复杂的类型参数,参数添加了[FromUri]属性,Web API将试图从查询字符串中得到Student类型参数的值。
同样,参考下面的Post方法:
[HttpPost]
public string Post([FromBody]string name)
{ }
Web API将从请求主体中获取基本类型参数的值,而不是从请求字符串中获取。
Web API(四):Web API参数绑定的更多相关文章
- SpringMVC第四篇【参数绑定详讲、默认支持参数类型、自定义参数绑定、RequestParam注解】
参数绑定 我们在Controller使用方法参数接收值,就是把web端的值给接收到Controller中处理,这个过程就叫做参数绑定- 默认支持的参数类型 从上面的用法我们可以发现,我们可以使用req ...
- 细说 Web API参数绑定和模型绑定
今天跟大家分享下在Asp.NET Web API中Controller是如何解析从客户端传递过来的数据,然后赋值给Controller的参数的,也就是参数绑定和模型绑定. Web API参数绑定就是简 ...
- springMVC学习(5)-参数绑定
接着上一集,记录参数绑定的过程: springmvc中,接收页面提交的数据是通过方法形参来接收: 一.默认支持的类型: 在controller形参中添加如下类型的参数处理适配器会默认识别并进行赋值: ...
- Asp.Net Web API 2第十六课——Parameter Binding in ASP.NET Web API(参数绑定)
导航 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnblogs.com/aehyok/p/3446289.html. 本文主要来讲解以下内容: ...
- ASP.NET Web API中的参数绑定总结
ASP.NET Web API中的action参数类型可以分为简单类型和复杂类型. HttpResponseMessage Put(int id, Product item) id是int类型,是简单 ...
- Parameter Binding in ASP.NET Web API(参数绑定)
Parameter Binding in ASP.NET Web API(参数绑定) 导航 阅读本文之前,您也可以到Asp.Net Web API 2 系列导航进行查看 http://www.cnbl ...
- Web API 入门三(参数绑定)
学到现在,感觉到微软的.NET各种框架和模型基础大致都差不多,所以,这部分内容大致和MVC部分差不多.在学习参事绑定之前,我们肯定要知道Controller(即控制器)是啥干啥的. 其实,Contro ...
- .net core Web API参数绑定规则
参数推理绑定 先从一个问题说起,微信小程序按照WebAPI定义的参数传递,Get请求服务器端可以正常接收到参数,但是Post请求取不到. Web API代码(.netcore 3.1)如下: [Htt ...
- 一张图说明 Web Api 参数绑定默认规则
请求如下: 控制器如下: 慎重说明:不管请求方式是 get 还是 post , 简单类型的参数,如 name 和 id ,其值都是从 url 里面去取. Web API 从 url 还是 body 获 ...
随机推荐
- PHP 大数自动转换为科学计数法
前段时间碰到一个很头疼的问题,就是大于12位的数字在PHP中,会自动转成科学计数法表 示. 比如 1234567891234 显示为 1.23456789123E+12 , 最后只能在计算出大数之后, ...
- 【Linux】排序命令uniq
很多时候,我们都会去计算一次数据里头的相同型态的数据总数,举例来说, 使用 last 可以查得这个月份有登陆主机者的身份.那么我可以针对每个使用者查出他们的总登陆次数吗? 此时就得要排序与计算之类的命 ...
- python学习笔记——线程threading (二)重写run()方法和守护进程daemon()
1 run()方法 1.1 单个线程 在threading.Thread()类中有run()方法. from time import ctime,sleep import threading # 定义 ...
- Putty设置删除
1. 开始→运行→cmd(进入字符界面) 2.切换目录到putty安装目录 3.执行以下清理命令 4.会跳出如下提示信息 点击[是(Y)]
- AVL平衡二叉搜索树原理及各项操作编程实现
C语言版 #include<stdio.h> #include "fatal.h" struct AvlNode; typedef struct AvlNode *Po ...
- 2-05. 求集合数据的均方差(15) (数学啊 ZJU_PAT)
题目链接:http://pat.zju.edu.cn/contests/ds/2-05 设计函数求N个给定整数的均方差.若将N个数A[]的平均值记为Avg,则均方差计算公式为: 输入格式说明: 第1行 ...
- window 环境 Composer 安装 thinkphp5
参考链接:https://www.kancloud.cn/thinkphp/thinkphp5_quickstart/478269 在 Windows 中,你需要下载并运行 Composer-Setu ...
- npm 模块化方式接入 font-awsome
https://segmentfault.com/q/1010000009795785/a-1020000009796355 $ npm install font-awesome 在main.js里添 ...
- MySQL查看SQL语句执行效率(转)
Explain命令在解决数据库性能上是第一推荐使用命令,大部分的性能问题可以通过此命令来简单的解决,Explain可以用来查看 SQL 语句的执行效 果,可以帮助选择更好的索引和优化查询语句,写出更好 ...
- C/C++ 数据结构之算法(面试)
数据结构中的排序算法. 排序算法的相关知识: (1)排序的概念:所谓排序就是要整理文件中的记录,使之按关键字递增(或递减)次序排列起来. (2)稳定的排序方法:在待排序的文件中,若存在多个关键字相同的 ...