提到WebApi接口荷逞,一般會(huì)想到以前用到的WebService和WCF服務(wù)扶檐。這三個(gè)技術(shù)都是用來創(chuàng)建服務(wù)接口,只不過WebAPI用起來更簡單瓦糕,不像WebServive底洗、WCF,尤其是WCF服務(wù)配置很復(fù)雜。
什么是WebApi
- 1 這是一個(gè)簡單的構(gòu)建HTTP服務(wù)的新框架
- 2 在.net平臺(tái)上Web API 是一個(gè)開源的刻坊、理想的枷恕、構(gòu)建RES-ful服務(wù)的技術(shù),最新版的Asp.net Core WebApi可以跨平臺(tái)。
- 3可以使用HTTP的全部特點(diǎn)(比如URIs谭胚、request/response頭徐块,緩存,版本控制灾而,多種內(nèi)容格式)
- 4它也支持MVC的特征胡控,像路由、控制器旁趟、行為昼激、過濾器、模型綁定锡搜、控制反轉(zhuǎn)(IOC)或依賴注入(DI)橙困,單元測試。這些可以使程序更簡單耕餐、更健壯
- 5可以發(fā)布部署到IIS上和還可以借用其他技術(shù)如(OWIN)部署在控制臺(tái)(微軟新技術(shù).net core的MVC 和webapi自動(dòng)支持寄宿到控制臺(tái)項(xiàng)目)
- 6 一個(gè)輕量級(jí)的框架凡傅,并且對(duì)限制帶寬的設(shè)備,比如智能手機(jī)平板等支持的非常好
- 7WebAPI數(shù)據(jù)格式可以轉(zhuǎn)換成Json肠缔、XML 或者任何你想轉(zhuǎn)換的自定義格式夏跷。
一項(xiàng)目搭建
這個(gè)項(xiàng)目目的:使用Dapper讀取MySQL數(shù)據(jù)庫的用戶表哼转,把對(duì)用戶的增刪改的操作接口通過WebAPI發(fā)布出去
首先新建一個(gè)空白解決方案,命名WebAPIService槽华,并添加一個(gè)空白文件壹蔓,命名Asp.netWebAPI,在這個(gè)空白文件夾下創(chuàng)建項(xiàng)目猫态。
在文件Asp.netWebAPI佣蓉,右鍵添加 Web項(xiàng)目,命名APIServer
選擇web模板Web API
在文件Asp.netWebAPI懂鸵,添加兩個(gè)類庫偏螺,APIDAL與APIModel,創(chuàng)建完如下圖:
是個(gè)編程小白都能看得懂這么簡單的結(jié)構(gòu)匆光。在此只介紹WebAPI的怎樣使用套像,實(shí)際架構(gòu)比這復(fù)雜的多,不再敘說终息。
APIDAL層和APIModel層設(shè)計(jì)
在Mysql數(shù)據(jù)庫創(chuàng)建了用戶表夺巩,
在Mysql數(shù)據(jù)庫創(chuàng)建了用戶表,本項(xiàng)目主要介紹了對(duì)用戶表的增刪改查等的接口的實(shí)現(xiàn)過程周崭。
APIDAL層通過使用Dapper操作用戶表柳譬。
下面是用戶表的數(shù)據(jù)結(jié)構(gòu)(用戶表主要存儲(chǔ)用戶的基本信息。如姓名续镇,年齡美澳,密碼等)
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類
/// <summary>
/// 用戶信息類
/// </summary>
public class Userinfo
{
/// <summary>
/// 用戶編號(hào)
/// </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>
/// 部門編號(hào)
/// </summary>
public int deptID { get; set; }
/// <summary>
/// 部門名稱
/// </summary>
public string DapName { get; set; }
/// <summary>
/// 創(chuàng)建時(shí)間
/// </summary>
public DateTime createtime { get; set; }
}
在APIDAL層添加讀取與操作數(shù)據(jù)庫UserInfoDal類UserInfoDal
/// <summary>
/// 用戶信息數(shù)據(jù)庫操作類
/// </summary>
public partial class UserInfoDal
{
static readonly string ConnectionString = ConfigurationManager.AppSettings["MySqlDBConnectionString"];
#region 查詢相關(guān)操作
/// <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
#region 查詢單個(gè)信息
/// <summary>
/// 查詢單個(gè)用戶的信息
/// </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">每頁要顯示幾行數(shù)據(jù)</param>
/// <param name="TotalItemCount">返回的總條數(shù)</param>
/// <param name="TotalPageCount">返回的總頁數(shù)</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層接口設(shè)計(jì)
修改ValuesController控制器代碼(同MVC控制器,就是一個(gè)類摸航。這個(gè)類是添加APISever 這個(gè)WebAPI項(xiàng)目時(shí)vs模板自動(dòng)生成的一個(gè)類),ValuesController類相當(dāng)于API接口的實(shí)現(xiàn)類制跟。,ValuesController在這通過調(diào)用APIDAL層封裝的讀取數(shù)據(jù)庫用戶表的方法 UserInfoDal,向外發(fā)布接口酱虎,此類必須繼承ApiController雨膨。(這是WebAPI框架規(guī)定的繼承,不能改變)
/// <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>
/// 根據(jù)用戶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">用戶信息實(shí)體</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">分頁實(shí)體類</param>
/// <returns></returns>
[HttpPost]
public IHttpActionResult Paging([FromBody]PageModel model)
{
//int TotalItemCount = 0;//總條數(shù)
//int TotalPageCount = 0;//總頁數(shù)
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">用戶類對(duì)象</param>
/// <returns></returns>
[HttpGet]//Get請(qǐng)求 g读串,默認(rèn)是將參數(shù)全部放到了url里面直接以string的形式傳遞的聊记,參數(shù)前需加上[FromUri]否則接收不到數(shù)據(jù)
public IHttpActionResult AddPage([FromUri]Userinfo model)
{
bool b = dal.AddUser(model);
if (b)
{
return Ok(new { success = "成功" });
}
return Ok(new { success = "失敗" });
}
#endregion
}
到此一個(gè)關(guān)于用戶信息操作的WebAPI接口創(chuàng)建完成了,簡單吧恢暖,沒什么難度排监。只要把數(shù)據(jù)訪問層設(shè)計(jì)好,WebAPI接口層只要?jiǎng)?chuàng)建一個(gè)繼承ApiController控制器的類杰捂,在這個(gè)類中
調(diào)用DAL層的數(shù)據(jù)訪問接口社露,這樣WebAPI接口就創(chuàng)建好了。
四 WebAPI發(fā)布前接口調(diào)試
按Ctrl+F5調(diào)試
調(diào)試出現(xiàn)的
http://localhost:47362/
中的端口號(hào)系統(tǒng)隨機(jī)指定的琼娘,在你的電腦中運(yùn)行可能會(huì)出現(xiàn)不同 的端口號(hào)峭弟。點(diǎn)擊頁面上的API
你會(huì)發(fā)現(xiàn)剛才在ValuesController控制器中創(chuàng)建的用戶信息表的增刪改查的接口方法,都詳細(xì)列舉出來了脱拼,連注釋都有瞒瘸。這里面詳細(xì)介紹了各個(gè)接口的調(diào)用方式,傳參方式及返回結(jié)果形式熄浓。一目了然情臭。這正是WebAPI的強(qiáng)大之處,不但簡單輕量赌蔑,連幫助文檔都這么友好俯在,比以前的WCF接口明白多了,我以往用WCF接口娃惯,如果沒有開發(fā)WCF的接口的詳細(xì)文檔或者開發(fā)WCF接口的人員和你溝通跷乐,是不太容易看得懂WCF接口的調(diào)用方式的。
在瀏覽器中調(diào)用查詢所有人員信息的接口 http://localhost:47362/api/Values/GetUserData
如果數(shù)據(jù)的數(shù)據(jù)出現(xiàn)在頁面上趾浅,這樣Web接口就成功調(diào)用出來了愕提。