首页 > 代码库 > WebAPI学习笔记

WebAPI学习笔记

WebAPI

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);
        }
    }
}

 

WebAPI学习笔记