webapi2:给前端提供数据的框架
Restful(语义)的数据提供方式:
Get(查)从服务器获取
Post(增)发送到服务器
Put(改)修改
Delete(删)删除
- MVC控制器:Controller
- API控制器:ApiController
返回值类型自动识别处理,可以返回对象和对象数组,列出成员
WebApiConfig.cs设置api的路由:
- 路由name不能重复
- routeTemplate不加api前缀会与MVC路由冲突
- 没有默认值:api是用来传输数据的,没有默认数据一说
Restful(语义)方式传输数据,action方法需要带对应的关键字(get、post等),例如GetAddress()可以,Address()不行
简单数据(id,name等)可以用url传参,post、put提交对象数据需要data提交
非Restful风格:
-
路由前缀[RoutePrefix("(控制器路径)")]为控制器下的每个方法添加一个内容为控制器路径的前缀
-
需要自己指定处理类型,例[HttpPost] 手动定义路由名[Route("(方法路由名)")]
-
完整示例:
[RoutePrefix("控制器路径")]
控制器:ApiController
{
[HttpPost]//还有[HttpGet]等特性,注明此action只能通过POST方法调用
[Route("方法路由名")]
行为方法(类型 参数)
{...}
}
- 方法路由名与方法名不一定一致,以路由名为主
- 行为方法的参数类型前可以加上[FromBody]限制,如:行为方法([FromBody]类型 参数)
[FromBody]
注明参数只能从Post请求体(body)中获取,FromBodyAttribute强制要求被其修饰的参数,必须是序列化后的实体成员。[FromBody]在一个方法中只能修饰一个参数。
- 如果客户端Content-Type是application/json, api接口如果是用单个对象做参数的时候,加或者不加[FromBody]都可以正常解析参数,但是接口是用对象列表做参数时候,则必须加[FromBody],否则读取不到参数。
- 如果客户端Content-Type不是application/json,api接口必须加[FromForm],否则客户端调用接口会报400错误。
- 如果加上[FromBody],客户端Content-Type不是application/json,接口会报400错误。
WebAPI请求
对于前端页面发起的get/post请求作出相应的处理,前端使用JQuery发起异步请求实现数据调用
一、Get请求
通过url传参
1. 无参数的Get请求
一般的 get 请求我们可以使用 jquery 提供的 $.get() 或者 $.ajax({type:“get”}) 来实现,在url中是拼接在url最后的以?开始的部分
后台方法示例:
public 返回值类型 GetAction(){...}
返回值类型可以是基本数据类型,也可以是类、List集合等等
2. 传递一个参数的Get请求
通常我们需要传递参数只需要指定 ajax 方法的 data 属性即可: data:{“name”:“赵大宝”}
后台方法示例:
public 返回值类型 GetAction(string name){...}
3. 传递多个参数的Get请求
按照上面的方法,对于多个参数我们可以很容易就写出来: data:{“name”:“赵大宝”,“age”:12}
后台方法示例:
public 返回值类型 GetAction(string name,string age){...}
二、Post请求
通过RequestBody传参
1. 无参数的Post请求
我们可以使用 $.post() 或 $.ajax({type:“post”}) 来发起 post 请求
后台方法示例:
public 返回值类型 PostAction(){...}
2. 传递一个参数的 Post 请求
前端data不用key=value而是=value。将key设置为空,如data:{""="赵大宝"}
;或者传一个单纯的字符串由后台去解析,如data:'"name=张三,age=21"'
用单引号包一个双引号,双引号里为字符串内容
后台方法示例:
public 返回值类型 PostAction([FromBody] string name){...}
3. 传递多个参数的Post请求
三种方法
前端:
$.ajax({
url: "/api/student/poststudent",
type: 'POST',
data:JSON.stringify({ name: "张三", age: 21 }),//Json序列化一个对象,小括号中是一个对象,可以单独定义
success:function () {
},
dataType: "json",
contentType: "application/json"
});
- 通过传递一个实体类对象
后端:
public class Student
{
public string Name { get; set; }
public int Age { get; set; }
}
[HttpPost]
public 类型 PostStudent(Student student)
{
//student.Age=21
//student.Name="张三"
...
}
- 通过dynamic动态类型
后端:
[HttpPost]
public 类型 PostStudent(dynamic student)
{
var name = student.name;//name大小写与前端参数一致,var类型接收
var age = student.age;
...
}
- JObject参数
后端:
[HttpPost]
public 类型 PostStudent(JObject student)
{
var name = student["name"];
var age = student["age"];
...
}
总结
Get请求与Post请求(以及其他请求方式)的根本原因是http协议以及浏览器规范对http请求传参的规定,从而体现出许多差异。.net WebApi的路由机制是通过模式匹配来进行的,可以自己定义一些路由模板或者启用特性路由,体现了该路由机制的灵活性
相关知识点
- .net WebApi路由机制
- .net WebApi模型绑定
- .net WebApi参数传递
- JQuery/Ajax发起请求
- Json