【源】
来自微软WebAPI官方视频,Introduction to the ASP.NET Web API --Uniform Interface -- Demo-Using convention 这一节。
先上一张WebAPI中所有用户Controller都必须继承的ApiController基类代码:
【详】
1.VS 2012中新建一MVC4的WebAPI项目;
2.添加CoursesController空WebAPI控制器,代码如下:
namespace WebApiDemo.Controllers
{
public class course
{
public int id;
public string title;
}
public class CoursesController : ApiController
{
static List<course> courses = InitCourses();
private static List<course> InitCourses()
{
var ret = new List<course>();
ret.Add(new course { id = , title = "Web Api" });
ret.Add(new course { id = , title = "Mobile programing" });
return ret;
} public IEnumerable<course> Get()
{
return courses;
} }
}
3.在HomeView中呈现:
更改/Views/Home/Index.cshtml代码,使其和下面代码相同;
<div id="body">
<ol id="courses"> </ol>
</div>
@section scripts
{
<script>
$.ajax({
url: '/api/courses',
success: function (courses) {
var list = $('#courses');
for (var i = 0; i < courses.length; i++)
{
var course = courses[i];
list.append('<li>' + course.title + '</li>');
}
} });
</script>
}
注意:
1) 原理:用jQuery代码,指定要访问的url是coursescontroller所在uri,从而获取courses的json数据;
如果获取成功,执行success后代码,通过循环将li添加到指定的ol中。
2)ol标签的id必须为courses,和下面$('#courses')中的相同,否则挂不上;
url、success等关键字也不能写错,否则运行不出,而且jQuery错误比较难查。
【果】
最终效果:
【update】
上面紧紧展示了GETALL的用法,CRUD补全后的Controller如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http; namespace WebApiDemo.Controllers
{
public class course
{
public int id;
public string title;
}
public class CoursesController : ApiController
{
static List<course> courses = InitCourses();
private static List<course> InitCourses()
{
var ret = new List<course>();
ret.Add(new course { id = , title = "Web Api" });
ret.Add(new course { id = , title = "Mobile programing" });
return ret;
} // GET api/courses
public IEnumerable<course> Get()
{
return courses;
} // GET api/courses/id
public course Get(int id)
{
var ret=(from c in courses
where c.id==id
select c).FirstOrDefault();
//todo: if null- should return 404
return ret;
} // Post api/courses
public void Post([FromBody]course c)
{
c.id = courses.Count;
courses.Add(c);
//TODO:: should return a 201 with a location head } // Put api/courses/id
public void Put(int id, [FromBody]course c)
{
var ret = (from v in courses
where v.id == c.id
select v).FirstOrDefault();
ret.title = c.title;
} // Delete api/courses/id
public void Delete(int id)
{
var ret = (from c in courses
where c.id == id
select c).FirstOrDefault();
courses.Remove(ret);
}
}
}
在此就不再为每个方法创建视图了,如果想要测试结果,可以使用视频中推荐的"Fiddler Web Debugger",官网:fiddler2.com
另外,如果不想使用Get、Put、Delete、Post作为WebApi Controller CRUD的方法名,就需要在自定义方法明前标注Attribute:
- C :[HttpPost]
- R : [HttpGet]
- U : [HttpPut]
- D : [HttpDelete]
如:
// GET api/courses
[HttpGet]
public IEnumerable<course> AllCourses()
{
return courses;
}
【知识点解析】
1.WebAPi Controller 方法参数中的[FromBody]&[FromUri],称为ModleBinding attribute
参数前缀修饰,用来指定参数值的来源。
FromBody:指示当前参数来源自HTML 的Body中,body只能被读取一次;
FromUri:指示当前参数来源于URL,比如QuerryString。
被修饰的参数,就不需要再给形参赋值,
WebAPI会自动将URI或HTTP Body中符合要求的数据绑定到方法中