提到WebApi接口,一般会想到以前用到的WebService和WCF服务。这三个技术都是用来创建服务接口,只不过WebAPI用起来更简单,不像WebServive、WCF,尤其是WCF服务配置很复杂。
什么是WebApi
- 1 这是一个简单的构建HTTP服务的新框架
- 2 在.net平台上Web API 是一个开源的、理想的、构建RES-ful服务的技术,最新版的Asp.net Core WebApi可以跨平台。
- 3可以使用HTTP的全部特点(比如URIs、request/response头,缓存,版本控制,多种内容格式)
- 4它也支持MVC的特征,像路由、控制器、行为、过滤器、模型绑定、控制反转(IOC)或依赖注入(DI),单元测试。这些可以使程序更简单、更健壮
- 5可以发布部署到IIS上和还可以借用其他技术如(OWIN)部署在控制台(微软新技术.net core的MVC 和webapi自动支持寄宿到控制台项目)
- 6 一个轻量级的框架,并且对限制带宽的设备,比如智能手机平板等支持的非常好
- 7WebAPI数据格式可以转换成Json、XML 或者任何你想转换的自定义格式。
一项目搭建
这个项目目的:使用Dapper读取MySQL数据库的用户表,把对用户的增删改的操作接口通过WebAPI发布出去
首先新建一个空白解决方案,命名WebAPIService,并添加一个空白文件,命名Asp.netWebAPI,在这个空白文件夹下创建项目。

image.png
在文件Asp.netWebAPI,右键添加 Web项目,命名APIServer

image.png
选择web模板Web API

image.png
在文件Asp.netWebAPI,添加两个类库,APIDAL与APIModel,创建完如下图:

image.png
是个编程小白都能看得懂这么简单的结构。在此只介绍WebAPI的怎样使用,实际架构比这复杂的多,不再叙说。
APIDAL层和APIModel层设计
在Mysql数据库创建了用户表,
在Mysql数据库创建了用户表,本项目主要介绍了对用户表的增删改查等的接口的实现过程。
APIDAL层通过使用Dapper操作用户表。
下面是用户表的数据结构(用户表主要存储用户的基本信息。如姓名,年龄,密码等)
1 2 3 4 5 6 7 8 9 10 11 12 13 | mysql> describe user; +------------+--------------+------+-----+----------------------------------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+--------------+------+-----+----------------------------------+----------------+ | ID | int(11) | NO | PRI | NULL | auto_increment | | Name | varchar(255) | NO | | NULL | | | Age | int(11) | YES | | NULL | | | Salary | float | NO | | NULL | | | DaptID | int(12) | NO | MUL | 2 | | | CreateTime | datetime | NO | | CURRENT_TIMESTAMP | | | Pwd | varchar(255) | NO | | 202CB962AC59075B964B07152D234B70 | | +------------+--------------+------+-----+----------------------------------+----------------+ 7 rows in set (0.07 sec) |
在APIModel层添加用户Userinfo类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | /// <summary> /// 用户信息类 /// </summary> public class Userinfo { /// <summary> /// 用户编号 /// </summary> public int id { get; set; } /// <summary> /// 姓名 /// </summary> public string name { get; set; } /// <summary> /// 密码 /// </summary> public string pwd { get; set; } /// <summary> /// 年龄 /// </summary> public int age { get; set; } /// <summary> /// 月薪 /// </summary> public double salary { get; set; } /// <summary> /// 部门编号 /// </summary> public int deptID { get; set; } /// <summary> /// 部门名称 /// </summary> public string DapName { get; set; } /// <summary> /// 创建时间 /// </summary> public DateTime createtime { get; set; } } |
在APIDAL层添加读取与操作数据库UserInfoDal类UserInfoDal
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | /// <summary> /// 用户信息数据库操作类 /// </summary> public partial class UserInfoDal { static readonly string ConnectionString = ConfigurationManager.AppSettings["MySqlDBConnectionString"]; #region 查询相关操作 /// <summary> /// 查询所有用户信息 /// </summary> /// <returns></returns> public List<Userinfo> GetAllUserInfo() { using (MySqlConnection connection = new MySqlConnection(ConnectionString)) { string sql = "select `user`.`Name`,`user`.ID,`user`.Salary,`user`.CreateTime ,department.DapName from `user` INNER JOIN department on `user`.DaptID = department.DaptID; "; var query = connection.Query<Userinfo>(sql); return query.ToList(); } } #endregion |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | #region 查询单个信息 /// <summary> /// 查询单个用户的信息 /// </summary> /// <param name="ID"></param> /// <returns></returns> public Userinfo GetUserInfo(int ID) { StringBuilder Sqlstr = new StringBuilder(); Sqlstr.Append(" select `user`.`Name`,`user`.ID,`user`.Salary,`user`.CreateTime from `user` "); Sqlstr.Append(" where ID=@ID"); using (MySqlConnection connection = new MySqlConnection(ConnectionString)) { var query = connection.Query<Userinfo>(Sqlstr.ToString(),new {ID}).SingleOrDefault(); return query; } } #endregion #region 分页 /// <summary> /// 用户信息分页查询接口 /// </summary> /// <param name="PageNumber">要查询的第几页</param> /// <param name="PageSize">每页要显示几行数据</param> /// <param name="TotalItemCount">返回的总条数</param> /// <param name="TotalPageCount">返回的总页数</param> /// <returns></returns> public List<Userinfo> GetUserInfoByPage(int PageNumber, int PageSize, out int TotalItemCount, out int TotalPageCount) { int pagestart = 0; TotalItemCount = 0; TotalPageCount = 0; pagestart = (PageNumber - 1) * PageSize; StringBuilder Sqlstr1 = new StringBuilder(); Sqlstr1.Append("select Count(user.ID) FROM user;"); using (MySqlConnection connection = new MySqlConnection(ConnectionString)) { TotalItemCount= connection.ExecuteScalar<int>(Sqlstr1.ToString()); } TotalPageCount = TotalItemCount / PageSize + 1; StringBuilder Sqlstr2 = new StringBuilder(); Sqlstr2.Append($"select * from user limit { pagestart },{ PageSize};"); using (MySqlConnection connection = new MySqlConnection(ConnectionString)) { var result= connection.Query<Userinfo>(Sqlstr2.ToString()); if (result.Count() > 0 && result != null) { return result.ToList(); } return null; } } #endregion } |
三 APISever层接口设计
修改ValuesController控制器代码(同MVC控制器,就是一个类。这个类是添加APISever 这个WebAPI项目时vs模板自动生成的一个类),ValuesController类相当于API接口的实现类。,ValuesController在这通过调用APIDAL层封装的读取数据库用户表的方法 UserInfoDal,向外发布接口,此类必须继承ApiController。(这是WebAPI框架规定的继承,不能改变)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 | /// <summary> /// 用户信息类接口 /// </summary> public class ValuesController : ApiController { UserInfoDal dal = new UserInfoDal(); /// <summary> /// 查询所有人员信息 /// </summary> /// <returns></returns> public IEnumerable<Userinfo> GetUserData() { List<Userinfo> sermodel = new List<Userinfo>(); sermodel = dal.GetAllUserInfo(); return sermodel; } /// <summary> /// 根据用户ID查询用户信息 /// </summary> /// <param name="id">用户ID</param> /// <returns></returns> [HttpGet] //[AcceptVerbs("GET", "HEAD")] public IHttpActionResult UpdateList(int id) { Userinfo x = dal.GetUserInfo(id); if (x != null) { return Ok(x); } return NotFound(); } /// <summary> /// 修改用户信息 /// </summary> /// <param name="model">用户信息实体</param> /// <returns></returns> public IHttpActionResult UpdateUserInfo(Userinfo model) { if (dal.UpdateUserInfo(model)) { return Json(new { success = "成功" }); } return Json(new { success = "失败" }); } /// <summary> /// 删除用户 /// </summary> /// <param name="id">用户ID</param> /// <returns></returns> [HttpGet] public IHttpActionResult Delete(int id) { if (dal.DeleteUserInfo(id)) { return Ok(1); } else { return Ok(0); } } /// <summary> /// 分页查询 /// </summary> /// <param name="model">分页实体类</param> /// <returns></returns> [HttpPost] public IHttpActionResult Paging([FromBody]PageModel model) { //int TotalItemCount = 0;//总条数 //int TotalPageCount = 0;//总页数 List<Userinfo> list = new List<Userinfo>(); list = dal.GetUserInfoByPage(PageNumber: model.PageNumber, PageSize: model.PageSize, TotalItemCount: out int TotalItemCount, TotalPageCount: out int TotalPageCount); return Ok(new { model = list, TotalItemCount, TotalPageCount }); } #region 添加 /// <summary> /// 添加用户 /// </summary> /// <param name="model">用户类对象</param> /// <returns></returns> [HttpGet]//Get请求 g,默认是将参数全部放到了url里面直接以string的形式传递的,参数前需加上[FromUri]否则接收不到数据 public IHttpActionResult AddPage([FromUri]Userinfo model) { bool b = dal.AddUser(model); if (b) { return Ok(new { success = "成功" }); } return Ok(new { success = "失败" }); } #endregion } |
到此一个关于用户信息操作的WebAPI接口创建完成了,简单吧,没什么难度。只要把数据访问层设计好,WebAPI接口层只要创建一个继承ApiController控制器的类,在这个类中
调用DAL层的数据访问接口,这样WebAPI接口就创建好了。
四 WebAPI发布前接口调试
按Ctrl+F5调试

image.png
调试出现的
点击页面上的API

image.png
你会发现刚才在ValuesController控制器中创建的用户信息表的增删改查的接口方法,都详细列举出来了,连注释都有。这里面详细介绍了各个接口的调用方式,传参方式及返回结果形式。一目了然。这正是WebAPI的强大之处,不但简单轻量,连帮助文档都这么友好,比以前的WCF接口明白多了,我以往用WCF接口,如果没有开发WCF的接口的详细文档或者开发WCF接口的人员和你沟通,是不太容易看得懂WCF接口的调用方式的。
在浏览器中调用查询所有人员信息的接口 http://localhost:47362/api/Values/GetUserData

image.png
如果数据的数据出现在页面上,这样Web接口就成功调用出来了。