Web API應用架構在Winform混合框架中的應用(3)--Winfrom界面調用WebAPI的過程分解


最近一直在整合WebAPI、Winform界面、手機短信、微信公眾號、企業號等功能,希望把它構建成一個大的應用平台,把我所有的產品線完美連接起來,同時也在探索、攻克更多的技術問題,並抽空寫寫博客,把相應的技術心得和成果進行一定的介紹,留下開拓的印記。本文主要介紹混合框架整合Web API應用過程中,分析Winform界面如何一步步對Web API的調用處理的。

1、Winform界面的應用方向

在很多場合,分布式采用Web方式構建應用,不過相對Winform來說,Web界面的體驗性沒有那么好,界面呈現也相對單調 一些,而且涉及到和打印、攝像、讀卡等硬件處理的時候,Winform的優勢就更加明顯了,Winform唯一被詬病的是其分布性的處理和安裝發布的問題,分布性可以通過直接利用Web API的方式進行處理,從而邏輯集中在Web API層,而安裝發布,則可以通過自動更新的模式進行處理,如目前很多桌面程序,都是自動更新的方式進行迭代更新。

因此Winform可以基於一個Web API的整體性平台,構建很多應用生態鏈。例如我們常見的微信應用(企業號,公眾號,訂閱號等)、以及Winform應用、原生APP、Web網站應用等等,如下圖所示。

其中是把Web API作為核心層,可以在上面開發我們各種企業業務應用就可以了。

在前面介紹過相應的Web API的封裝和調用規則,如下圖所示,紅色部分為Web API 的調用路線,從Winform客戶端開始,經過統一門面結構Facade接口層,對Web API的服務層進行調用,下面這個圖從大的方向來闡述了整個調用的路線,不過於調用細節的理解並不很准確,因為涉及到很多內容已經省略了。 下面我們將把整個調用的路線進行完整的闡述說明。

 

2、Winfrom界面調用WebAPI的過程

在前面的小節里面,我們說到了Winform調用Web API的過程,這個過程可以通過下面這個圖示進行講解。

1)首先我們在界面一般是通過定義一個Winform窗體,並在其中放置相應的控件來承載信息的,這個和普通的Winform是一樣的,例如我們定義一個窗體對象FrmMember,以及FrmEditMember。

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接口設計經驗總結 

Web API應用架構在Winform混合框架中的應用(3)--Winfrom界面調用WebAPI的過程分解

 Web API應用架構在Winform混合框架中的應用(4)--利用代碼生成工具快速開發整套應用

Web API應用架構在Winform混合框架中的應用(5)--系統級別字典和公司級別字典並存的處理方式

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM