国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

Web API接口設計經驗總結

開發 前端
在Web API接口的開發過程中,我們可能會碰到各種各樣的問題,我在前面兩篇隨筆《Web API應用架構在Winform混合框架中的應用(1)》、《Web API應用架構在Winform混合框架中的應用(2)--自定義異常結果的處理》也進行了總的介紹,在經過我的大量模塊實踐并成功運行后,總結了這篇隨筆,希望對大家有所幫助。

在Web API接口的開發過程中,我們可能會碰到各種各樣的問題,我在前面兩篇隨筆《Web API應用架構在Winform混合框架中的應用(1)》、《Web API應用架構在Winform混合框架中的應用(2)--自定義異常結果的處理》也進行了總的介紹,在經過我的大量模塊實踐并成功運行后,總結了這篇隨筆,希望對大家有所幫助。

1、在接口定義中確定MVC的GET或者POST方式

由于我們整個Web API平臺是基于MVC的基礎上進行的API開發,因此整個Web API的接口,在定義的時候,一般需要顯示來聲明接口是[HttpGet]或者[HttpPost],雖然有些接口也可以不用聲明,但是避免出現類似下面 的錯誤信息,顯式聲明還是有好處的。

例如在基類定義的查找對象接口如下所示。

  1. /// <summary> 
  2.         /// 查詢數據庫,檢查是否存在指定ID的對象 
  3.         /// </summary> 
  4.         /// <param name="id">對象的ID值</param> 
  5.         /// <returns>存在則返回指定的對象,否則返回Null</returns> 
  6.         [HttpGet] 
  7.         public virtual T FindByID(string id, string token) 

如果是增刪改的接口,一般需要聲明為POST方式提交數據,而且基于安全性的考慮,需要攜帶更多的參數。

2、動態對象的接口定義

在一般的Web API接口里面,我們可能都會碰到很多簡單類型的參數,但是又想讓它們以POST方式提交數據,那么我們就可以有兩種方法來處理,一種是定義一個類來放置 這些參數,一種是采用動態的JObject參數,前者有很多不方便的地方,因為我們不可能為每個接口參數定義多一個實體類,這樣可能會有很多難以管理的類 定義。如下面是微信API的調用接口案例,我們也需要設置這樣的處理規則。

  1. 接口調用請求說明 
  2. http請求方式: POST(請使用https協議) 
  3. https://api.weixin.qq.com/cgi-bin/groups/update?access_token=ACCESS_TOKEN 
  4. POST數據格式:json 
  5. POST數據例子:{"group":{"id":108,"name":"test2_modify2"}} 

那么我們采用JObject是這么樣的呢,我們來看接口的定義和處理代碼。JObject是Newtonsoft.Json.Linq命名空間下的一個對象。

 
  1. /// <summary> 
  2.         /// 修改用戶密碼 
  3.         /// </summary> 
  4.         /// <param name="param">包含userName和userPassword的復合對象</param> 
  5.         /// <param name="token">用戶訪問令牌</param> 
  6.         /// <returns></returns> 
  7.         [HttpPost] 
  8.         public CommonResult ModifyPassword(JObject param,  string token) 
  9.         { 
  10.             //令牌檢查,不通過則拋出異常 
  11.             CheckResult checkResult = CheckToken(token); 
  12.             dynamic obj = param; 
  13.             if (obj != null
  14.             { 
  15.                 string userName = obj.userName; 
  16.                 string userPassword = obj.userPassword; 
  17.  
  18.                 bool success = BLLFactory<User>.Instance.ModifyPassword(userName, userPassword); 
  19.                 return new CommonResult(success); 
  20.             } 
  21.             else 
  22.             { 
  23.                 throw new MyApiException("傳遞參數出現錯誤"); 
  24.             } 
  25.         } 
 

其中我們把JObject對象轉換為我們所需要的對象的時候,因為我們沒有定義具體的實體類,因此采用了dynamic語法,聲明這是一個動態對象,由運行時獲取對應的屬性。

dynamic obj = param;

這樣我們就可以在調用的時候,動態POST對應的JSON對象給Web API接口,而不需要預先定義各種接口參數的類了。

 
  1. /// <summary> 
  2.         /// 調用Web API接口,修改用戶密碼 
  3.         /// </summary> 
  4.         /// <param name="userName">用戶名稱</param> 
  5.         /// <param name="userPassword">修改的密碼</param> 
  6.         /// <returns>如果修改成功返回true,否則返回false</returns> 
  7.         public bool ModifyPassword(string userName, string userPassword) 
  8.         { 
  9.             var action = "ModifyPassword"
  10.             var postData = new 
  11.             { 
  12.                 userName = userName, 
  13.                 userPassword = userPassword 
  14.             }.ToJson(); 
  15.  
  16.             string url = GetTokenUrl(action); 
  17.  
  18.             CommonResult result = JsonHelper<CommonResult>.ConvertJson(url, postData); 
  19.             return (result != null) ? result.Success : false
  20.         } 
 

其中GetTokenUrl是根據token和API的地址等參數,構建一個完整的提交地址。我們在上面代碼通過

            var postData = new             {                 userName = userName,                 userPassword = userPassword             }.ToJson();

就可以動態創建一個對象,并生成它的JSON字符串,把數據POST提交到對應的API接口里面即可,然后對結果進行對象的轉換就算完成了。

3、集合和分頁的處理

在很多接口里面,我們都需要用到分頁的處理,Web API也不例外,這樣可以提交數據檢索效率,減少服務器數據處理的壓力,同時也提交客戶端的數據顯示速度。

一般的集合接口定義如下所示(通用性基類接口)。

  1. /// <summary> 
  2.         /// 返回數據庫所有的對象集合 
  3.         /// </summary> 
  4.         /// <returns>指定對象的集合</returns> 
  5.         [HttpGet] 
  6.         public virtual List<T> GetAll(string token) 
  7.         { 
  8.             //檢查用戶是否有權限,否則拋出MyDenyAccessException異常 
  9.             base.CheckAuthorized(AuthorizeKey.ListKey, token); 
  10.  
  11.             List<T> list = baseBLL.GetAll(); 
  12.             return list; 
  13.         } 

但是這樣的返回記錄會比較多,一般情況下需要分頁,那么分頁的處理接口定義如下所示。

 
  1. /// <summary> 
  2.         /// 根據條件查詢數據庫,并返回對象集合(用于分頁數據顯示) 
  3.         /// </summary> 
  4.         /// <returns>指定對象的集合</returns> 
  5.         [HttpPost] 
  6.         public virtual PagedList<T> FindWithPager(string condition, PagerInfo pagerInfo, string token) 
 

分頁接口,在這里返回的結果里面,用了一個PageList的泛型類,這個方便我們獲取當前的記錄及總數,它的定義如下所示。 

  1. /// <summary> 
  2.     /// 分頁集合 
  3.     /// </summary> 
  4.     /// <typeparam name="T">對象</typeparam> 
  5.     public class PagedList<T> 
  6.     { 
  7.         /// <summary> 
  8.         /// 返回記錄的總數 
  9.         /// </summary> 
  10.         public int total_count { get; set; } 
  11.  
  12.         /// <summary> 
  13.         /// 列表集合 
  14.         /// </summary> 
  15.         public List<T> list { get; set; } 
  16.     } 

***整個分頁的處理Web API接口實現如下所示。

 
  1. /// <summary> 
  2.         /// 根據條件查詢數據庫,并返回對象集合(用于分頁數據顯示) 
  3.         /// </summary> 
  4.         /// <returns>指定對象的集合</returns> 
  5.         [HttpPost] 
  6.         public virtual PagedList<T> FindWithPager(string condition, PagerInfo pagerInfo, string token) 
  7.         { 
  8.             //檢查用戶是否有權限,否則拋出MyDenyAccessException異常 
  9.             base.CheckAuthorized(AuthorizeKey.ListKey, token); 
  10.  
  11.             List<T> list = baseBLL.FindWithPager(condition, pagerInfo); 
  12.  
  13.             //構造成Json的格式傳遞 
  14.             var result = new PagedList<T>() { total_count = pagerInfo.RecordCount, list = list }; 
  15.             return result; 
  16.         } 
 

***客戶端調用分頁的Web API代碼如下所示。

 
  1. /// <summary> 
  2.         /// 根據條件查詢數據庫,并返回對象集合(用于分頁數據顯示) 
  3.         /// </summary> 
  4.         /// <param name="condition">查詢的條件</param> 
  5.         /// <param name="pagerInfo">分頁實體</param> 
  6.         /// <returns>指定對象的集合</returns> 
  7.         public virtual List<T> FindWithPager(string condition, ref PagerInfo pagerInfo) 
  8.         { 
  9.             var action = "FindWithPager"
  10.             string url = GetTokenUrl(action) + string.Format("&condition={0}", condition); 
  11.             var postData = pagerInfo.ToJson(); 
  12.  
  13.             List<T> result = new List<T>(); 
  14.             PagedList<T> list = JsonHelper<PagedList<T>>.ConvertJson(url, postData); 
  15.             if (list != null
  16.             { 
  17.                 pagerInfo.RecordCount = list.total_count;//修改總記錄數 
  18.                 result = list.list; 
  19.             } 
  20.             return result; 
  21.         } 

4、混合框架界面整合Web API接口

在整個Web API的平臺構建以及在混合框架的整合過程中,我把各個模塊還是遵循相對獨立的方式進行開發和整合,它們實現了從直接訪問數據庫、以WCF服務獲取數據,以及通過WebAPI調用方式獲取數據幾種方式的統一,從而實現了整個混合框架的高度整合。

整個混合框架的核心是以相對獨立的方式,整合各個可重用的模塊,我們可以遵循一定的基礎上,快速構建統一的應用平臺。

搭建完畢的整個WebAPI平臺,其中包括了服務端內容,以API控制器的方式,發布了對應的Web API接口。

在每個混合框架的獨立模塊里面,我們封裝了對應的Web API客戶端調用處理,從而實現了Web API的調用方式。

在Win10下,使用Web API模式運行混合框架,獲得的主體界面效果如下所示。

獨立模塊權限管理系統界面如下所示。

<

 
責任編輯:王雪燕 來源: 博客園
相關推薦

2009-08-21 17:42:36

C#調用API

2009-09-02 14:14:44

C# COM接口轉換

2009-10-15 09:27:00

2009-10-16 18:01:06

VB.NET調用Win

2015-10-16 14:35:05

SaaSCRM架構設計

2009-09-16 17:13:54

學習Linq

2009-09-29 16:32:11

OJB Hiberna

2009-08-19 09:24:43

AJAX引擎經驗總結

2009-10-22 15:07:12

綜合布線工程

2009-08-20 17:35:47

Servlet和JSP

2011-07-08 13:15:52

JSP

2009-09-08 10:57:55

LINQ查詢操作

2010-06-12 17:37:18

UML實踐指南

2009-11-17 11:24:00

PHP應用技巧

2009-09-08 16:02:47

Linq使用Group

2009-09-16 17:44:54

LINQ to SQL

2009-09-11 13:29:31

LINQ查詢操作

2009-09-25 17:26:55

使用Hibernate

2010-01-27 18:12:14

Android dia

2009-09-27 14:53:38

Hibernate S
點贊
收藏

51CTO技術棧公眾號

亚洲色图综合网| 三级一区在线视频先锋| 91网站在线观看免费| 在线观看视频91| 免费欧美视频| 国产日韩成人内射视频| 国产一区二区av| 九九**精品视频免费播放| av在线电影免费观看| 777精品视频| 337p粉嫩大胆噜噜噜噜噜91av | 亚洲一区二区三区免费看| 欧日韩精品视频| 香蕉av一区二区| 中文字幕第12页| 欧美一级淫片丝袜脚交| 中文字幕不卡的av| 51vv免费精品视频一区二区| 无码人妻h动漫| 色综合视频网站| 99精品视频在线免费观看| 日韩制服一区| 欧美综合在线播放| www.欧美免费| 久久免费视频色| 一本色道69色精品综合久久| 欧美三级理论片| 91wwwcom在线观看| 亚洲精品日日夜夜| 国产探花在线精品| 日韩有码电影| 在线观看一区视频| 成人伊人222| 日本人成精品视频在线| 国产精品高清亚洲| 国产麻豆精品久久| 欧美 日韩 国产 高清| 日韩中文字幕在线播放| 久久九九99视频| 最新国产精品视频| 中文字幕电影在线| 久久精品国产99精品国产亚洲性色| 欧美一区二区三区免费在线看| 美女视频黄 久久| 日韩色性视频| 又黄又爽又色视频| 91青青草免费观看| 日韩精品一区二区三区中文精品| 狠狠色狠狠色综合| 视频成人永久免费视频| 天天看片激情网站| 久久99精品久久久久久久久久 | 2020av在线| 91丨porny丨探花| 欧美黄色免费网站| 亚洲一区二区三区精品在线| 亚洲区国产区| 欧美成人精品一区二区男人小说| 北条麻妃在线一区| 91九色单男在线观看| 精品国一区二区三区| 99精品久久免费看蜜臀剧情介绍| 天堂成人娱乐在线视频免费播放网站| 中文字幕一区二区三区免费视频| 久久久久久国产精品免费免费| 亚洲色无码播放| 最新不卡av在线| 在线不卡欧美| 91另类视频| 国产视频青青| 国产欧美一区二区三区另类精品 | 色婷婷综合激情| 欧美成人aaa| aaa大片免费观看| 国产一区二区三区四区五区加勒比| 日韩高清人体午夜| 国产精品久久久久久久裸模| 亚洲精品a级片| 久久青青视频| 午夜影院观看视频免费| 四虎影视永久免费在线观看一区二区三区| 日韩在线视频网站| 欧美性猛xxx| 成人免费看的视频| 久久影视一区| 538视频在线| 成视人a免费观看视频| 国产在线精品一区二区中文| www.日本久久久久com.| 欧美性猛交xxxx免费看| av不卡在线播放| 欧美全黄视频| 91国产一区| 米奇777四色精品人人爽| 爱情岛论坛vip永久入口| 欧美不卡在线一区二区三区| 午夜美女久久久久爽久久| 欧美一区二区观看视频| 中文字幕在线观看不卡视频| 久久精品国产成人一区二区三区| japanese国产精品| 深夜福利亚洲| 日韩专区在线| 美女视频免费观看网站在线| 亚洲色婷婷久久精品av蜜桃| 亚洲一区久久久| 欧美高清性猛交| 日韩h在线观看| 日本韩国视频一区二区| 久久亚洲综合色一区二区三区| 精品白丝av| 亚洲丁香日韩| 国产韩日精品| 成人免费观看视频大全| 啦啦啦中文高清在线视频 | 91在线看国产| 老司机午夜免费精品视频| 国产一区二区三区四区| 亚洲成av在线| 在线观看h网| 日韩电影在线观看完整版| 热久久精品国产| 综合久久国产| 久久久久久a亚洲欧洲aⅴ| 国产精品九九九| 欧美二区在线播放| 国产亚洲欧美日韩美女| 欧美大片一区二区| 欧美综合亚洲图片综合区| 亚洲美女一区二区三区| 91网上在线视频| 激情综合网最新| 1000部精品久久久久久久久| 欧美日韩在线二区| 欧美成人基地| 欧美电影院免费观看| 欧美艳星kaydenkross| 污片视频在线免费观看| 亚洲国产aⅴ天堂久久| 水蜜桃在线免费观看| 亚洲欧洲一二区| 国产91网红主播在线观看| 中文字幕成人精品久久不卡| 精品国产露脸精彩对白 | 欧洲亚洲在线| 成人免费网站视频www| 国产原创popny丨九色| www.日本三级| 一区二区三区电影| 欧美日韩精品免费看| 国产精品久久精品视| 亚洲综合日韩在线| 国产欧美一区二区三区视频| 4444欧美成人kkkk| 欧美一级电影久久| 97久久伊人激情网| 91av在线不卡| 日韩av电影免费观看高清| 欧美亚洲一区在线| 国产成人自拍视频在线观看| 日本精品在线视频 | 日韩av电影免费在线| 国产在线精品一区二区三区| 成人资源av| 国产精品久久久久久久天堂第1集 国产精品久久久久久久免费大片 国产精品久久久久久久久婷婷 | 97香蕉超级碰碰久久免费软件| 久久视频在线播放| 久久亚洲国产精品| 欧美大片在线看| 91国产一区在线| 国产精品99久久久久久久久久久久| 欧洲亚洲免费视频| 国产精品久久不能| 国产欧美一区二区| 懂色中文一区二区三区在线视频| 国产98在线|日韩| 欧美精品一区在线| 一区二区三区|亚洲午夜| 国产精品h视频| 亚洲熟妇av日韩熟妇在线| 欧美性猛交久久久乱大交小说| 久草在线在线视频| 伊人网在线观看| 男人的天堂在线视频免费观看| 日本在线视频中文有码| 超碰在线公开| 人人精品久久| 亚洲+小说+欧美+激情+另类| 日韩欧美网址| 欧美亚洲一区| 国产乱码字幕精品高清av | 免费看成人av| 国产成人三级视频| 男人揉女人奶房视频60分 | 国产精品一二三四| 久久久久久久久久久久久夜| 亚洲最新视频在线观看| 欧美性做爰猛烈叫床潮| 亚洲精品美女在线观看| 欧美日本啪啪无遮挡网站|