###前言
1
| 为了配合app数据接口,需要开发数据接口,为了学习,无耻的使用了webapi.
|
###总结
####命名
1
| 在Asp.Net Web API中,一个控制器就是一个处理HTTP请求的类,控制器的public 方法被叫做action方法或者简单的Aciton。当Web API接收到一个请求的时候,它将这个请求路由到一个Action。
|
为了确定那个Action被调用,这个框架使用了一个路由表。Visual Studio中Web API的项目模板会创建一个默认路由,这个路由是在WebApiConfig.cs文件中定义的,该文件位于App_Start目录:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
1
| 路由表中的每一个条目都包含一个路由模板。这个Web API默认的路由模版是"api/{controller}/{id}"。在这个模版中,“api”是一个文字式路径片段,而{controller}和{id}则是占位符变量。
|
当Web API框架接收一个HTTP请求时,它会试图根据路由表中的一个路由模板来匹配其URI。如果无路由匹配,客户端会接收到一个404(未找到)错误。
1
| 在路由中使用“api”的原因是为了避免与ASP.NET MVC的路由冲突。通过这种方式,可以用“/contacts”进入一个MVC控制器,而“/api/contacts”进入一个Web API控制器。当然,如果你不喜欢这种约定,你也可以修改这个默认路由表。
|
一旦一个匹配的路由被发现,Web API便会选择相应的Controller和Action。
1.为了找到Controller,Web API会把“控制器”加到{controller}变量的值。
2.为了找到Action,Web API会查找HTTP方法,然后寻找一个名称以HTTP方法名开头的方法。例如,对于一个Get请求,Web API会查找一个以“Get…”开头的动作,如“GetContact”或“GetAllContacts”等。这种约定只应用于GET、POST、PUT和DELETE方法。通过在你的Controller上使用attributes,你可以启用其他的HTTP方法。
3.路由模版中其他的占位变量,例如{id},将被映射成Action的参数。
####Get请求
一般的get请求我们可以使用jquery提供的$.get() 或者$.ajax({type:”get”}) 来实现:
$.get("api/Foodlist/Getlist", function (data) {
console.log(JSON.stringify(data));
});
1
| 请求的后台Action方法仍为上篇文章中的Getlist() :
|
public List<Food> Getlist()
{
return null;
}
通常我们需要传递参数只需要指定ajax方法的data属性即可: data:{“name”:”张三”,”num”:2}
$.ajax({
url:"api/food",
type:"get",
data:{"name":"张三","num":2},
success:function(data){
console.log(data);
}
});
public string GetOrder(string name,int num)
{
return name+"订购了"+num+"份菜";
}
我们可以使用$.post() 或$.ajax({type:”post”}) 来发起post请求:
$.ajax({
url:"api/Foodlist/Postlist",
type:"Post",
success:function (data) {
console.log(JSON.stringify(data));
}
});
1
| 请求的后台Action方法仍为上篇文章中的Getlist() :
|
public List<Food> Postlist()
{
return null;
}
在Action 方法中我们需要使用 [FromBody] 属性标签来标明属性。在post请求中,方法的参数必须要用 [FromBody] 属性来修饰才可以, [FromBody] 就告诉Web API 要从post请求体重去获取参数的值。Web API 要求请求传递的 [FromBody] 参数,肯定是有一个特定的格式,才能被正确的获取到。而这种特定的格式并不是我们常见的 key=value 的键值对形式。Web API 的模型绑定器希望找到 [FromBody] 里没有键名的值,也就是说, 不是 key=value ,而是 =value 。
$.ajax({
url:"api/food",
type:"post",
data:{"":"张三"},
success:function(data){
console.log(data);
}
});
public string Postname([FromBody]string name)
{
return string.Format("姓名:{0}",name);
}
1
| Post多个参数的处理:[FromBody] 修饰的参数只能有一个。我们需要对传递的多个参数进行封装才行。这里,我们可以将 Name和 Num 封装成一个User类,并且带一个对象数组:
|
public class User()
{
public string name{set;get;}
public int num{set;get;}
public List<OrderList> orderlist { get; set; }
}
public class OrderList
{
public int id { get; set; }
public int fd_amount { get; set; }
public string rate { get; set; }
public string cost { get; set; }
}
var user={
name:"张三",
num:2,
orderlist:[{id:1,fd_amount:1,rate:"100",cost:"88"},{id:2,fd_amount:1,rate:"100",cost:"88"}]
};
$.ajax({
url:"api/food",
type:"post",
data:JSON.stringify(user),
Content-type:"application/json",
success:function(data){
console.log(data);
}
});
[HttpPost]
public string Post([FromBody]User user)
{
return string.Format("姓名:{0},订购:{1}份,其中一份为:{2}",user.name,user.num,user.orderlist[0].id);
}
####Post请求中对于参数的处理是需要重点注意.