WebApi是添加到Asp.Net平台的一个新特性,可以快速的创建Web服务,并对客户端提供HTTP的API调用接口
WebApi是建立在MVC框架基础之上,但不属于MVC的一部分。
控制器WebApi特性是在MVC的基础上添加一个特殊的控制器。他有两个明显的特征:
1)动作方法返回的是模型对象,而不是ActionResult对象。
2)动作方法是根据请求所使用的HTTP方法来选择的。
第1很好理解,第2做一下解释。首先我们看一下WebAPI的配置文件。(文件都是由Global.asax,在应用程序启动时进入运行)
public static class WebApiConfig { public static void Register(HttpConfiguration config) { config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); } }
其中配置路径:"api/{controller}/{id}"。 可以看到,没有action方法。
当一个与WebAPI路由匹配的请求到达应用程序时,动作是通过行程该请求的 HTTP请求方法 来决定的。其中最常用的就是GET 和 POST。
当直接访问网址时,浏览器就会指定GET方法来请求。通过路由可以定位控制器,然后会通过HTTP方法来查找。
在对API的方法进行命名的时候,约定是以它所支持的HTTP方法作为前缀。例如:GetAll()。
或者使用注解属性来实现相同功能,例如添加 [HttpPost] 特性。如果POST请求,则会优先查找此方法。
API控制器的动作方法返回的模型对象被编码成JSON,并发送给客户端。不支持视图、布局等特性。
WebAPI控制器,,需要继承ApiController。可直接右键添加。
注意:不同浏览器调用方法的时候,会添加不同的请求头。其中Accept报头会返回可接受的数据格式,如其中包含application/xml,则会返回Xml形式的报文。
我们在使用Ajax发送Post请求的时候,一定要注意,Content-Type:application/json (请求类型)和dataType:"Json" (响应类型)。
并且在接受Post请求的时候,需要在参数前面加上FromBody,表示内容从请求正文获取。
FromBody只能定义一个参数,故此如需传递多个参数请进行一下封装处理。
var album = { AName:"我", ADate:"2014-08-18", ASize:50, ALock:true }; $.ajax({ url:"api/user/po", type:"post", data:JSON.stringify(album), contentType:"application/json", success:function(data){ console.log(data); } }); public class Album { ...... } public string Po([FromBody]Album po) { return ""; }
一个完整的增删改查例子
namespace TodoApip.Controllers { [Route("api/[controller]")] public class TodoController : Controller { public ITodoRepository TodoItems { get; set; } public TodoController(ITodoRepository todoItems) { TodoItems = todoItems; } public IEnumerable<TodoItem> GetAll() { return TodoItems.GetAll(); } [HttpGet("{id}")] public IActionResult GetById(string id) { var item = TodoItems.Find(id); if (item == null) { return NotFound(); } return new ObjectResult(item); } [HttpPost] public IActionResult Create([FromBody]TodoItem item) { if (item == null) { return BadRequest(); } TodoItems.Add(item); return CreatedAtRoute("GetTodo", new { controller = "Todo", id = item.Key }, item); } [HttpPut("{id}")] public IActionResult Update(string id, [FromBody]TodoItem item) { if (item == null || item.Key != id) { return BadRequest(); } var todo = TodoItems.Find(id); if (todo == null) { return NotFound(); } TodoItems.Update(item); return new NoContentResult(); } [HttpDelete("{id}")] public void Delete(string id) { TodoItems.Remove(id); } } }