Asp.net WebAPI+Dapper搭建API服務(wù)接口

提到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)目猫态。
image.png
在文件Asp.netWebAPI佣蓉,右鍵添加 Web項(xiàng)目,命名APIServer
image.png

選擇web模板Web API


image.png
在文件Asp.netWebAPI懂鸵,添加兩個(gè)類庫偏螺,APIDAL與APIModel,創(chuàng)建完如下圖:
image.png

是個(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)試

image.png

調(diào)試出現(xiàn)的 http://localhost:47362/中的端口號(hào)系統(tǒng)隨機(jī)指定的琼娘,在你的電腦中運(yùn)行可能會(huì)出現(xiàn)不同 的端口號(hào)峭弟。
點(diǎn)擊頁面上的API
image.png

你會(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

image.png

如果數(shù)據(jù)的數(shù)據(jù)出現(xiàn)在頁面上趾浅,這樣Web接口就成功調(diào)用出來了愕提。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市皿哨,隨后出現(xiàn)的幾起案子浅侨,更是在濱河造成了極大的恐慌,老刑警劉巖证膨,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件如输,死亡現(xiàn)場離奇詭異,居然都是意外死亡央勒,警方通過查閱死者的電腦和手機(jī)不见,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來订歪,“玉大人脖祈,你說我怎么就攤上這事∷⒔” “怎么了盖高?”我有些...
    開封第一講書人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長眼虱。 經(jīng)常有香客問我喻奥,道長,這世上最難降的妖魔是什么捏悬? 我笑而不...
    開封第一講書人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任撞蚕,我火速辦了婚禮,結(jié)果婚禮上过牙,老公的妹妹穿的比我還像新娘甥厦。我一直安慰自己纺铭,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開白布刀疙。 她就那樣靜靜地躺著舶赔,像睡著了一般。 火紅的嫁衣襯著肌膚如雪谦秧。 梳的紋絲不亂的頭發(fā)上竟纳,一...
    開封第一講書人閱讀 49,036評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音疚鲤,去河邊找鬼锥累。 笑死,一個(gè)胖子當(dāng)著我的面吹牛集歇,可吹牛的內(nèi)容都是我干的桶略。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼鬼悠,長吁一口氣:“原來是場噩夢啊……” “哼删性!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起焕窝,我...
    開封第一講書人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤蹬挺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后它掂,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體巴帮,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年虐秋,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了榕茧。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡客给,死狀恐怖用押,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情靶剑,我是刑警寧澤蜻拨,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站桩引,受9級(jí)特大地震影響缎讼,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜坑匠,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一血崭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦夹纫、人聲如沸咽瓷。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽忱详。三九已至,卻和暖如春跺涤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背监透。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來泰國打工桶错, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人胀蛮。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓院刁,卻偏偏與公主長得像,于是被迫代替她去往敵國和親粪狼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子退腥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • 本系列主要翻譯自《ASP.NET MVC Interview Questions and Answers 》- B...
    圣杰閱讀 3,938評(píng)論 0 56
  • 流浪(念出) 像海追趕風(fēng)兒像天迷情大地我像個(gè)孤獨(dú)患者在這世間流離 見過最美夕陽巧遇人生佳麗在不應(yīng)該驕傲的年紀(jì)選擇在...
    奇奇怪怪小技巧閱讀 297評(píng)論 9 10
  • 一、本周好習(xí)慣打卡執(zhí)行情況: [x]早起打卡(7/7) [x]發(fā)“早安”朋友圈(7/7) [x]晨間日記+三只青蛙...
    邱明閱讀 140評(píng)論 0 0
  • 我將銘記今夜清輝的溫柔 莫問我是何緣由 僅是以你為名 書寫那從未被吟唱的哀愁 甕裏里空藏著勝天的權(quán)謀 故夢的西風(fēng)已...
    封章閱讀 114評(píng)論 0 0