WebAPI的由来:
在早期的时候,我们用来传输数据的接口是 .NetRemoting:平台要求,到后来的Webservice(跨平台、SOAP协议,数据以xml的格式体现)、WCF(也支持Restful风格,但是它
并不是为Restful服务,相对于而言,会显得比较重量级)以上接口,在开发工作中,我们默认为后台接口,而随着移动互联网行业的兴起,调用方可能不再局限于PC,会包括诸如IOS安卓等,此时webapi就诞生了。
那么,WebAPI到底是什么? WebAPI其实就是遵循Restful风格所架设的一种API
Restful概述:
架构风格,以资源为视角,来描述服务的。
以json/xml....来描述,http方法 统一了数据操作
Restful要素
表现层的状态转换:资源;统一接口;URI;无状态;
资源:实体就是资源,在数据上体现是: json/xml/数据流......
统一接口:CRUD(增删改查),是通过http的method体现 get post put/patch delete
URI:url
Get:查询 post 新增 put/patch 修改 delete 删除
无状态:http无状态(前后没有关联)
路由(默认)
1 启动 Application_Start--WebApiConfig.Register--把路由规则写入一个容器
2 运行 请求会去容器匹配--找到第一个满足的控制器--然后找action(http method):
a 以特性为准 [HttpGet]、[HttpPost]、[httpPut]、[Httppatch]、[HttpDelete] 特性写在方法的上面
b 方法名以Get开头
c (找方法时)优先最匹配 api/values/1--Get(int id)
特性路由
概念
在实际中会存在一个资源,同一种操作更新,可能有多个来源途径,或者不同版本号,如果按照默认路由则无法区分
我们可以在方法之前加上特性路由标识Route
Route("api/values/{id}/GetName")]//注意,最后的GetName不是方法名,可以理解为别名
路由前缀
通常情况下,一个Controller下的action会使用相似的路由模板,如
[Route("api/books")]
·[Route("api/books/{id:int}")]
·[Route("api/books/{bookid}/authors")]
这时候可以为整个controller指定[RoutePrefix]特性,以使用共同的前缀,把[RoutePrefix("/api/books")]加到controller上,action的路由特性就变成这样:
·[Route("")]
·[Route("{id:int}")]
·[Route("{bookid}/authors")]
此外,路由前缀中也可以包含参数,如[RoutePrefix("api/{userid}/books")]
这里还有两个小技巧
如果有某个特殊路由不希望使用前缀,可以在路由中添加~,如[Route("~api/otherbooks")]
有时候需要几个路由片段结合起作用,如日期 /api/books/date/2013/06/17
这时候就需要使用字符* ,
[Route("date/{*date:datetime:regex(\d{4}/\d{2}/\d{2})}")],不过这种参数只能用作路由的最后一个参数