1.什么是WebAPI
Web API是网络应用程序接口。包含了广泛的功能,网络应用通过API接口,可以实现存储服务、消息服务、计算服务等能力,利用这些能力可以进行开发出强大功能的web应用。
它可以对接各种客户端(浏览器,移动设备),构建http服务的框架。
2.定义WebAPI接口
Web API的接口有四种请求方式分别是:GET(获取一条或者多条数据)、POST(添加数据)、PUT(更新数据)和DELTE(删除数据)。
由Web API的路由规则可知,Web API的路由规则只绑定到Controller,所以是根据请求的方式和传递的参数来匹配合适的Action,否则将会报错。
public static void Register(HttpConfiguration config) { config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); }
定义主要由以下两种方式:
(1)增加Post、Get、Put或者Delete的前缀
这里的前缀不区分大小写,系统根据不同的http请求方式找到拥有相应前缀的方法名,具体如下所示:
public IEnumerableGetUsers() { return new string[] { "value1", "value2" }; }
(2)指定特性[HttpPost]、[HttpGet]、[HttpPut]和[HttpDelete]
这种方式是等效于第一种方式的,但是当同时用了这两种方式,但是特性和前缀的访问方式不同的话,以特性为准。
注意点:
相同的请求方式下,方法名的命名规则和路由的匹配是没有关系的,如下:
[HttpGet] public IEnumerableUsers() { return new string[] { "2", "value2" }; } [HttpGet] public IEnumerable Cates() { return new string[] { "1", "value2" }; }
这样通过get方式访问/api/Home/Users和/api/Home/Cates虽然方法名不同,但是结果却都是相同的报错,如下:
发生错误。 找到了与该请求匹配的多个操作: 类型 MvcApplication1.Api.HomeController 的 System.Collections.Generic.IEnumerable`1[System.String] Users() 类型 MvcApplication1.Api.HomeController 的 System.Collections.Generic.IEnumerable`1[System.String] Cates() System.InvalidOperationException 在 System.Web.Http.Controllers.ApiControllerActionSelector.ActionSelectorCacheItem.SelectAction(HttpControllerContext controllerContext) 在 System.Web.Http.Controllers.ApiControllerActionSelector.SelectAction(HttpControllerContext controllerContext) 在 System.Web.Http.ApiController.ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken) 在 System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsyncInternal(HttpRequestMessage request, CancellationToken cancellationToken) 在 System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
如果将方法稍作修改在Cates增加一个参数id,如下:
[HttpGet] public IEnumerableUsers() { return new string[] { "2", "value2" }; } [HttpGet] public IEnumerable Cates(int id) { return new string[] { "1", "value2" }; }
那么访问/api/Home/Users?id=1或者任意的action如那么访问/api/Home/xxxx?id=1都可以正确访问得到如下结果:
1 value2
但是访问/api/Home/Users或者/api/Home/Cate的话就会报错:
请求无效。 对于“MvcApplication1.Api.HomeController”中方法“System.Collections.Generic.IEnumerable`1[System.String] Cates(Int32)”的不可以为 null 的类型“System.Int32”的参数“id”,参数字典包含一个 null 项。可选参数必须为引用类型、可以为 null 的类型或声明为可选参数。
综上所述,Web API的通过请求方式和传递的参数来寻找到对应的方法,与方法名无关。
3.参数的传递
(1)[FromUri] 和 [FromBody]
Web API的参数获取和普通的Controller有些许不同,参数提交有表单提交和url后面参数传递两种方式,Web API就有对应的着两种参数的获取分别[FromBody]获取表单提交的数据,[FromUri] 获取url传参。如下:
[HttpPost] public IEnumerableUsers([FromUri]User user,[FromUri] int day,[FromBody] string str) { return new string[] { "2", "value2" }; }
默认是[FromUri],否则就会获取指定方式传递的参数,可以是类会自动组装,不允许重复参数的传递与接收。
(2)传统获取
用下面这段代码可以获取get请求的数据:
var current = HttpContext.Current.Request;
但是这样会有一个问题,就是前面讲到的,因为方法没有参数所以当方法众多时会有多个参数匹配的方法错误。
4.返回值
Web API返回的数据格式有很多种如IEnumerable<string>(包括json格式和xml格式)、string、void等,但是使用的过程中基本时返回json或者xml格式的数据,所以这里主要讲这两种。Web API可以返回IEnumerable<string>这样的强类型,
默认返回的时xml格式的数据,在浏览器中输入地址,返回的是xml格式的数据,那怎么返回json格式的呢?
public HttpResponseMessage GETH(int id) { string[] strArry = new string[] { "2", "value2" }; string json = JsonConvert.SerializeObject(strArry); //返回纯文本text/plain ,返回json application/json ,返回xml text/xml HttpResponseMessage result = new HttpResponseMessage { Content = new StringContent(json, Encoding.GetEncoding("UTF-8"), "application/json") }; return result; }
以上的代码就可以返回json的数据,并且还有其他的返回格式。或者通过更改ajax请求头的contentType: "application/json; charset=utf-8"来将xml数据转为json格式。