最近一直在整合WebAPI、Winform界面、手機短信、微信公衆號、企業號等功能,但願把它構建成一個大的應用平臺,把我全部的產品線完美鏈接起來,同時也在探索、攻克更多的技術問題,並抽空寫寫博客,把相應的技術心得和成果進行必定的介紹,留下開拓的印記。本文主要介紹混合框架整合Web API應用過程當中,分析Winform界面如何一步步對Web API的調用處理的。html
在不少場合,分佈式採用Web方式構建應用,不過相對Winform來講,Web界面的體驗性沒有那麼好,界面呈現也相對單調 一些,並且涉及到和打印、攝像、讀卡等硬件處理的時候,Winform的優點就更加明顯了,Winform惟一被詬病的是其分佈性的處理和安裝發佈的問題,分佈性能夠經過直接利用Web API的方式進行處理,從而邏輯集中在Web API層,而安裝發佈,則能夠經過自動更新的模式進行處理,如目前不少桌面程序,都是自動更新的方式進行迭代更新。數據庫
所以Winform能夠基於一個Web API的總體性平臺,構建不少應用生態鏈。例如咱們常見的微信應用(企業號,公衆號,訂閱號等)、以及Winform應用、原生APP、Web網站應用等等,以下圖所示。json
其中是把Web API做爲核心層,能夠在上面開發咱們各類企業業務應用就能夠了。瀏覽器
在前面介紹過相應的Web API的封裝和調用規則,以下圖所示,紅色部分爲Web API 的調用路線,從Winform客戶端開始,通過統一門面結構Facade接口層,對Web API的服務層進行調用,下面這個圖從大的方向來闡述了整個調用的路線,不過於調用細節的理解並不很準確,由於涉及到不少內容已經省略了。 下面咱們將把整個調用的路線進行完整的闡述說明。微信
在前面的小節裏面,咱們說到了Winform調用Web API的過程,這個過程能夠經過下面這個圖示進行講解。架構
1)首先咱們在界面通常是經過定義一個Winform窗體,並在其中放置相應的控件來承載信息的,這個和普通的Winform是同樣的,例如咱們定義一個窗體對象FrmMember,以及FrmEditMember。app
2)在主體界面裏面,咱們須要調用FrmMember這個窗體,能夠經過對話框的方式,或者是多文檔的方式進行調用顯示。框架
FrmEditMember dlg = new FrmEditMember(); dlg.ShowDialog();
或者多文檔界面展現分佈式
ChildWinManagement.LoadMdiForm(this, typeof(FrmMember));
3)在界面裏面,咱們須要調用接口對象(Web API的客戶端包裝類)進行獲取對應的信息,這裏使用到了接口工廠CallerFactory<T>這種方式進行調用。工具
MemberInfo info = CallerFactory<IMemberService>.Instance.FindByID(ID);
4)上面這個工廠類CallerFactory<T>是負責獲取到對應的接口實現類並建立對象,方便咱們進行調用處理。它的邏輯主要是經過IMemberService接口所在的程序集(例如WHC.CloudMember.WebApiCaller),而後獲取對應接口的實現類,並構建一個這樣的接口實例出來使用的。
例如字典模塊,混合框架裏面,他們的各個模塊的實現類是放在程序集裏面的,咱們的目標就是根據接口的名稱,從對應的部分獲取相應的Web API接口調用包裝類進行使用。
5)咱們構建的Web API接口調用包裝類(WebApiCaller裏面的內容),爲了實現更加方便的調用,咱們爲它進行了必定的封裝,使它在基於泛型的基礎上具備基礎增刪改查、分頁等功能的調用處理。
從這個類的定義裏面,咱們能夠看到Web API的調用包裝類MemberCaller是繼承自BaseApiService<MemberInfo>這樣的泛型基類的。這個BaseApiService<MemberInfo>就具備對特定對象的增刪改查、分頁等基礎調用功能了。
例如在基類BaseApiService裏面的查找對應對象的接口代碼以下所示
/// <summary> /// 查詢數據庫,檢查是否存在指定ID的對象(用於字符型主鍵) /// </summary> /// <param name="key">對象的ID值</param> /// <returns>存在則返回指定的對象,不然返回Null</returns> public virtual T FindByID(string key) { var action = "FindByID"; string url = GetTokenUrl(action) + string.Format("&id={0}", key); return JsonHelper<T>.ConvertJson(url); }
這裏面的邏輯就是構建一個帶有token(用戶身份標識)的鏈接字符串和參數字符串,從而獲取HTML內容後把它轉換爲具體對象的處理了。
其中轉換的代碼就是利用了Newtonsoft.Json的對象的轉換,具體代碼以下所示。
/// <summary> /// 轉換Json字符串到具體的對象 /// </summary> /// <param name="url">返回Json數據的連接地址</param> /// <returns></returns> public static T ConvertJson(string url) { HttpHelper helper = new HttpHelper(); helper.ContentType = "application/json"; string content = helper.GetHtml(url); VerifyErrorCode(content); T result = JsonConvert.DeserializeObject<T>(content); return result; }
6)用戶的訪問令牌(Token信息)
固然咱們調用這個接口前,咱們須要獲取到對應的Token(用戶令牌)而後才能進行API的調用了。這個Token的機制採用了JWT的令牌生成方式,具備很好的通用性。
例如我使用本身的Web API調試工具,獲取到對應的token方式以下所示。下面的1-5的標識就是獲取token所須要的簽名數據,固然鏈接還帶有幾個帳號認證所須要的信息了,如帳號密碼、所在公司等信息。
固然咱們也可使用瀏覽器進行測試獲取Token的信息,只是沒有那麼方便而已。
系列文章以下所示:
Web API應用架構在Winform混合框架中的應用(1)
Web API應用架構在Winform混合框架中的應用(2)--自定義異常結果的處理
Web API應用架構在Winform混合框架中的應用(3)--Winfrom界面調用WebAPI的過程分解