web api名词解释
提供基于RESTFUL架构的web服务,通过HTTP请求方法(GET、PUT、POST、DElETE)映射到服务器端相应的ACTION方法(CRUD)
是一个框架可以轻松构建http服务覆盖广泛的客户端,包括浏览器和移动设备,webapi是在.netFramwork上构建restful程序的理想平台
web api 路由
在webapi中,默认路由机制是通过解析http请求的类型来匹配Action,也就是说WebAip默认路由不需要指定Action的名称。比如:/api/User,这个url表示匹配User控制器下的【HttpGet】方法,/api是固定必填值,这是路由的默认的解析方式。
public static void Register(HttpConfiguration config)
{
// Web API 路由
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
mvc 和webapi路由区别
1.在mvc中默认路由机制是通过url路径来匹配Action.比如:/User/GetList,这个url
表示匹配User控制器下的GetList方法,这是MVC路由的默认解析方式。
WebApi的默认路由机制通过http请求的类型匹配Action
2.webApi的路由配置文件是WebApiConfig.cs,MVC的路由配置文件是RouteConfig.cs
3.WebApi的Controller继承自Web.http.ApiController,MVC的Controller继续自Web.Mvc.Controller
注:若Controller中有多个请求类型相同、参数相同、方法名不同的方法、那个webApi的默认路由机制就不够用了
Web api的传参数
Get请求
方法名以Get开头,WebApi会自动默认这个请求就是get请求,而如果你以其他名称开头而又不标注方法的请求方式,那么这个时候服务器虽然找到了这个方法,但是由于请求方式不确定,所以直接返回给你405——方法不被允许的错误。
1. 基础类型参数
public class Student
{
public int Id { get; set; }
public string Name { get; set; }
public int Age { get; set; }
public string Address {get;set;}
}
$(function () {
$.ajax({
type:'Get',
url: '/api/Study',
data: { Name: 'sy',age:11},
success: function (data, staus) {
if (staus == "success") {
$('#studentID').html(data);
}
}
})
})
[HttpGet]
public string GetStudent(int Age, string Name)
{
return "Name:" + Name + "Age:" + Age;
}
2.实体作为参数
get请求时,我们直接将json对象当做实体传递后台,后台是接收不到的
Get请求的时候可以在参数里面加上[FromUri]即可直接得到对象
$(function () { $.ajax({ type:'Get', url: '/api/Study', data: { Name: 'sy',age:11,address:"赣州" ,id:12}, success: function (data, staus) { if (staus == "success") { $('#studentID').html(data); } } }) }) [HttpGet] public string GetStudent([FromUri]Student stu) { return stu.Id.ToString(); }
3.数组
Post请求
- 基础类型参数
我们一般的通过url取参数的机制是键值对,即某一个key等于某一个value,而这里的FromBody和我们一般通过url取参数的机制则不同,它的机制是=value,没有key的概念,并且如果你写了key(比如你的ajax参数写的{NAME:"Jim"}),后台反而得到的NAME等于null
$(function () {
$.ajax({
type:'Post',
url: '/api/Study',
data: { '': 'sy'},
success: function (data, staus) {
if (staus == "success") {
$('#studentID').html(data);
}
}
})
})
[HttpPost]
public string GetStudent([FromBody]string Name) {
return Name;
}
多个基础类型的数据
很多的解决办法是新建一个类去包含传递的参数,感觉不太好,因为如果我们前后台每次传递多个参数的post请求都去新建一个类的话,我们系统到时候会有多少个这种参数类?
通过dynamic动态类型 contentType: 'application/json'这个要加上
[HttpPost]
public string GetStudent(dynamic stu) {
return stu.Address;
}
$(function () {
$.ajax({
type: 'Post',
contentType: 'application/json',
url: '/api/Study',
data: JSON.stringify({ Name: 'sy',Age:25,Address:"赣州"}),
success: function (data, staus) {
if (staus == "success") {
$('#studentID').html(data);
}
}
})
})
- 实体作为参数
如果你指定了contentType为application/json,则必须要传递序列化过的对象;如果使用post请求的默认参数类型,则前端直接传递json类型的对象即可。
$(function () {
$.ajax({
type: 'Post',
contentType: 'application/json',
url: '/api/Study',
data: JSON.stringify({ Name: 'sy',Age:25,Address:"赣州"}),
success: function (data, staus) {
if (staus == "success") {
$('#studentID').html(data);
}
}
})
})
[HttpPost]
public string GetStudent(Student stu) {
return stu.Address;
}
默认参数类型contentType
$(function () {
$.ajax({
type: 'Post',
url: '/api/Study',
data: { Name: 'sy', Age: 25, Address: "赣州" },
success: function (data, staus) {
if (staus == "success") {
$('#studentID').html(data);
}
}
})
})
[HttpPost]
public string GetStudent(Student stu) {
return stu.Address;
}
实体和基础类型一起作为参数传递
神奇的dynamic又派上用场了
$(function () {
var datas = { Name: 'sy', Age: 25, Address: "赣州" };
$.ajax({
type: 'Post',
contentType: 'application/json',
url: '/api/Study',
data: JSON.stringify({ Name2: 'kfz', StrData: datas }),
success: function (data, staus) {
if (staus == "success") {
$('#studentID').html(data);
}
}
})
})
[HttpPost]
public string GetStudent(dynamic stu)
{
var oCharging = Newtonsoft.Json.JsonConvert.DeserializeObject<Student>(Convert.ToString(stu.StrData));
return stu.Name2 + "==="+oCharging.Name;
}
数组作为参数
$(function () {
var arr = ["1", "2", "3", "4"];
$.ajax({
type: "post",
url: '/api/Study',
contentType: 'application/json',
data: JSON.stringify(arr),
success: function (data, status) {
$('#studentID').html(data);
}
});
})
[HttpPost]
public string GetStudent(string [] stu) {
return stu[0];
}
实体集合
$(function () {
var arr = [
{ ID: "1", NAME: "fff", age: "2020" },
{ ID: "2", NAME: "sss", age: "1994" },
{ ID: "3", NAME: "xxxx", age: "1995" }
];
$.ajax({
type: "post",
url: '/api/Study',
contentType: 'application/json',
data: JSON.stringify(arr),
success: function (data, status) {
$('#studentID').html(data);
}
});
})
[HttpPost]
public string GetStudent(List<Student> stu) {
return stu[0].Name;
}
Put请求
它和用法和post请求基本相同
Delete请求
参数传递机制和post也是基本相同