WebApi是微软在VS2012 MVC4版本中绑定发行的,WebApi是彻底基于Restful标准的框架。RestFul: (英文:Representational State Transfer,简称REST)网上关于Restful定义的资料不少,我我的理解的Restful api 是指基于资源的定义的接口,它的全部接口都是对资源的操做。REST的核心原则是将你的API拆分为逻辑上的资源。这些资源经过http被操做(GET ,POST,PUT,DELETE).Restful Api接口标准的定义知足CURD,标准的接口定义以下:html
- Post:新增记录
- Put:修改记录
- Get:获取数据
- Delete:删除数据
webapi标准的定义形式为:每一个controller都对应一个Model,controller中的接口都应该是对controller所对应的那个model进行的操做,因此上诉的post,get,put,delete都是对model所对应的资源操做。可是在实际的操做中,可能没有办法彻底知足这种定义的形式,力求尽可能知足。web
WebAPI项目和典型的MVC项目同样,包含主要的Models,Views,Controllers等文件夹和Global.asax文件。Views对于WebAPI来讲没有太大的用途,Models中的Model主要用于保存Service和Client交互的对象,这些对象默认状况下会被转换为Json格式的数据进行传输,Controllers中的Controller用于提供服务。和普通的MVC同样,Global.asax用于配置路由规则。json
在实际应用中,Controller是WebAPI的连接服务器和客户端的窗口。Controller的好坏影响整个系统的设计。Controller中是各类Action接口,对于Action接口,咱们有必要对其接收的参数和返回值了解。api
Action返回类型
WebAPI服务函数的返回值主要能够分为void、普通对象、HttpResponseMessag、IHttpActionResult 四种,这里简单的介绍一下。服务器
Void类型
通常来讲,Delete和Put类型的求情返回void类型的值,如:架构
public class DepartmentController : ApiController { public void Delete(int id) { } }
不过一个交互性好的接口,应该返回正确的Http status code,如返回200,对列子作修改:app
public class DepartmentController : ApiController { public HttpStatusCode Delete(int id) { return HttpStatusCode.OK; } }
普通对象
普通对象一般是由Get接口返回。例如:框架
public class CompanyController : ApiController { public Company Get(int id) { return CompanyInfo; } }
HttpResponseMessag
HttpResponseMessage是标准Http应答了,此时服务器并不作任何处理,能够直接将HttpResponseMessage发送给客户端。asp.net
public HttpResponseMessage Get() { var response = Request.CreateResponse(HttpStatusCode.OK); response.Content = new StringContent("Success", Encoding.UTF8); return response; }
IHttpActionResult
IHttpActionResult是Web API 2中引入的一个接口,IHttpActionResult是HttpResponseMessage的一个工厂类。IHttpActionResult是WebAPI中推荐的标准返回值,ApiController类中也提供了很多标准的工厂函数方便咱们快速构建它们,如BadRequest,Conflict,Ok,NotFound等,一个简单的示例以下:函数
public IHttpActionResult Get(int id) { var dto = new ProductDataDTO(); dto = AutoMapper.Mapper.Map<ProductDataDTO>(ProductDataService.QueryProductData (id)); return Ok(dto);
}
Action参数类型
Get请求的参数,均在URI中给出,比较简单,不作过多说明。下面主要对POST请求的参数作一下说明。
POST请求
单一POST参数
单一的参数请求,须要使用[FromBody]标记参数,以下图所示:
[AcceptVerbs("POST")] public string Post([FromBody]string data) { return string.Format(@"Data:{1}", data); }
除了使用[FromBody]标记参数外,也可使用dynamic关键字标记参数。
多个参数的POST请求
有了上面的经验,多个参数的例子,按照常理来讲,应该以下所示
[AcceptVerbs("POST")] public string Post([FromBody]string data, [FromBody]string name) { return string.Format(@"Name:{0},Data:{1}", name, data); }
但在实际调用中却报错,报错以下:
查了资料,缘由是在一个接口中,被[FromBody]修饰的参数只能有一个。对此,咱们能够将上面的两个参数封装为一个对象传递。以下:
public class Person { public string name { set; get; } public string message { set; get; } } ...... [AcceptVerbs("POST")] public string TEST4([FromBody]Person data) { return string.Format(@"Name:{0},Message:{1}", data.name, data.message); }
除此以外,还有另一种方式实现,使用[FromURi]关键字,以下所示:
public string TEST2([FromUri]string data,[FromBody]string name) { return string.Format(@"Name:{0},Data:{1}",name,data); }
须要说明的是,在WebApi的接口参数中,在没有标记的状况下,参数默认是[FromUri]形式,Get请求的接口的参数都是FromUri,顾名思议是从Uri获取数据。一个接口能够有多个FromUri参数(这些参数通常都是简单参数),可是只能有一个FromBody的参数。
就刚才的例子而言,data数据在Uri中获取,而name数据则从body中获取。
传递对象
有了上面的例子,其实传递对象在上面已经讲过了,就是使用[FromBody]或dynamic标记参数。
传递不一样的多个对象
这种状况,最近打算写这篇文章的时候,查找资料的时候,在其余人的博文中看到的,地址以下:http://www.cnblogs.com/babycool/p/3922738.html,里面提到了传递多个不一样对象的状况,我的也尝试去试着调试,可是一直没有成功,也就很差作过多的说明。后来想了下,其实能够另辟蹊径解决这个方法,新建一个对象,将要传递的对象作了属性,这样来传递给后台接口。关于最后这种方式,你们感兴趣能够去看看原文。