微信小程式的Web API介面設計及常見介面實現

来源:http://www.cnblogs.com/wuhuacong/archive/2017/09/07/7488939.html
-Advertisement-
Play Games

微信小程式給我們提供了一個很好的開發平臺,可以用於展現各種數據和實現豐富的功能,通過小程式的請求Web API 平臺獲取JSON數據後,可以在小程式界面上進行數據的動態展示。在數據的關鍵 一環中,我們設計和編寫Web API平臺是非常重要的,通過這個我們可以實現數據的集中控制和管理,本篇隨筆介紹基於... ...


微信小程式給我們提供了一個很好的開發平臺,可以用於展現各種數據和實現豐富的功能,通過小程式的請求Web API 平臺獲取JSON數據後,可以在小程式界面上進行數據的動態展示。在數據的關鍵 一環中,我們設計和編寫Web API平臺是非常重要的,通過這個我們可以實現數據的集中控制和管理,本篇隨筆介紹基於Asp.NET MVC的Web API介面層的設計和常見介面代碼的展示,以便展示我們常規Web API介面層的介面代碼設計、參數的處理等內容。

1、Web API整體性的架構設計

我們整體性的架構設計,包含一個Web管理後臺、一個Web API統一介面層、當然還有資料庫什麼,另外還有一個小程式客戶端。整個架構體系還是以我之前隨筆介紹的《整合微信小程式的Web API介面層的架構設計》內容為藍本

整個體系以Web API為主提供服務,同時後臺管理系統通過各種界面維護著數據的增刪改等基礎管理工作。

Web API的分層,我們可以通過下圖來瞭解具體的分層結構。

 

隨著基於JSON格式的Web API的廣泛應用,越來越多的企業採用Web API介面服務層,作為統一介面的核心所在,也成為Web API核心層。基於JSON格式的介面,可以廣泛地、跨平臺的應用於IOS、安卓等移動端,也可以應用在常規的Web業務系統,Winform業務系統、微信應用、微信小程式等方方面面,因此企業內部形成自己是的一套Web API標準和詳細的文檔非常重要。

我們可以細化為下麵的架構設計圖,所有模塊均圍繞著Web API 介面層進行擴展,底層的數據存儲對上層的應用是完全透明,我們可以根據需要拆分各種業務資料庫,以及使用我們認為合適的資料庫。

其中我們在Web API介面層上還看到一個微信消息交互的模塊,這個模塊我們為了方便功能變數名稱埠的處理,和Web API 是統一放在一起的,它負責和騰訊微信伺服器進行消息的交互處理,從而實現各種消息推送處理。

 

2、基於Asp.NET MVC的Web API介面的實現

 1)GET方式

GET方式,介面參數包括有零或一個參數,以及多個參數的方式,返回的值可以是簡單的字元串等基礎類型,也可以是複雜的自定義對象類型等,如下麵幾種介面代碼所示。

        /// <summary>
        /// 簡單的GET方式獲取數據
        /// </summary>
        /// <param name="id">字元串ID</param>
        /// <param name="token">介面訪問令牌</param>
        /// <returns>返回字元串值</returns>
        [HttpGet]
        public string Test(string id, string token)
        {
            return string.Format("返回結果, id:{0}", id);
        }

        /// <summary>
        /// 多個參數的GET方式獲取數據
        /// </summary>
        /// <param name="id">字元串ID</param>
        /// <param name="name">名稱</param>
        /// <param name="token">介面訪問令牌</param>
        /// <returns>返回字元串值</returns>
        [HttpGet]
        public string TestMulti(string id, string name, string token)
        {
            return string.Format("返回結果, id:{0} name:{1}", id, name);
        }

        /// <summary>
        /// 參數測試GET返回自定義實體類對象
        /// </summary>
        /// <param name="id">字元串ID</param>
        /// <param name="token">介面訪問令牌</param>
        /// <returns>返回自定義實體類對象</returns>
        [HttpGet]
        public virtual CommonResult TestObject(string id, string token)
        {
            return new CommonResult() { Data1 = id, Success = true };
        }

        /// <summary>
        /// 測試GET返回列表對象
        /// </summary>
        /// <param name="token">介面訪問令牌</param>
        /// <returns>返回列表對象</returns>
        [HttpGet]
        public List<string> TestAction(string token)
        {
            List<string> list = new List<string>() { "123", "234", "345" };
            return list;
        }

 

2)POST方式

POST方式,同樣也和GET方式的一樣,介面參數包括有零或一個參數,以及多個參數的方式,返回的值可以是簡單的字元串等基礎類型,也可以是複雜的自定義對象類型等,這就是幾種常規的介面處理。但是,對於多個參數的介面定義,我們需要對它們進行轉換處理,需要使用JObject param的方式進行定義,這樣可以很好對多個參數或者自定義的實體類參數進行解析。

下麵是幾種常規的POST介面定義方式。

        /// <summary>
        /// 測試使用POST方式提交數據,參數輸入為多個,使用JObject處理
        /// </summary>
        /// <returns>返回字元串</returns>
        [HttpPost]
        public string TestPost(JObject param, string token)
        {
            dynamic obj = param;
            string id = obj.id;
            if (obj != null)
            {
                return string.Format("返回結果, id:{0}", id);
            }
            else
            {
                throw new MyApiException("傳遞參數出現錯誤");
            }
        }

        /// <summary>
        /// 測試使用POST方式提交數據,參數輸入為多個,使用JObject處理
        /// </summary>
        /// <returns>返回參數計算數值</returns>
        [HttpPost]
        public int TestPostSimple(JObject param)
        {
            dynamic obj = param;
            if (obj != null)
            {
                return obj.x * obj.y * 10;
            }
            else
            {
                throw new MyApiException("傳遞參數出現錯誤");
            }
        }    
        
        /// <summary>
        /// 測試POST的方法,方法統一採用JObject param 方式定義,包含一個msg字元串對象,以及一個CListItem對象
        /// </summary>
        /// <returns>返回一個通用的CommonResult對象,包括Data1,Data2,Data3的信息</returns>
        [HttpPost]
        public CommonResult TestPostObject(JObject param)
        {
            dynamic obj = param;
            if (obj != null)
            {
                string msg = obj.msg; //消息對象
                //如果obj.item為類對象,那麼需要轉換為JObject然後使用ToObject轉換為對應類型
                CListItem item = ((JObject)obj.item).ToObject<CListItem>();

                var result = new CommonResult(true, msg);
                result.Data1 = msg;
                result.Data2 = item.Text;
                result.Data3 = item.Value;
                return result;
            }
            else
            {
                throw new MyApiException("傳遞參數出現錯誤");
            }
        }
        /// <summary>
        /// 修改分組,方法統一採用JObject param 方式定義,包括一個字元串對象contactId,一個字元串列表對象groupIdList
        /// </summary>
        /// <returns>返回一個通用的對象</returns>
        [HttpPost]
        public CommonResult TestPostList(JObject param)
        {
            dynamic obj = param;
            if (obj != null)
            {
                string contactId = obj.contactId; //聯繫人ID
                //如果是List<string>的類似列表,不能直接轉換,先轉換為JArray後使用ToObject轉換為對應列表
                List<string> groupIdList = ((JArray)obj.groupIdList).ToObject<List<string>>();

                var result = true; //BLLFactory<Address>.Instance.ModifyAddressGroup(contactId, groupIdList);
                return new CommonResult(result);
            }
            else
            {
                throw new MyApiException("傳遞參數出現錯誤,請檢查是否包含了contactId和groupIdList");
            }
        }

介面類,我們一般把類繼承自自己的API介面基類,並對它的異常處理進行處理,以便對錯誤統一格式回應,如下介面類的代碼定義所示。

    /// <summary>
    /// 此控制器用來詳細介紹各種GET/POST的介面設計
    /// 對於GET方式,方法可以接受多個參數
    /// 對於POST方式,方法如果有參數使用POST方式,統一採用JObject param對象參數。
    /// 如果POST方式有多個參數,如Web API介面加token,則需要客戶端把該參數追加在URL上,如url?token=123,然後在使用POST操作
    /// </summary>
    [ExceptionHandling]
    public class TestController : BaseApiController

其中ExceptionHandling是我們的統一異常過濾處理定義,代碼如下所示。

    /// <summary>
    /// API自定義錯誤過濾器屬性
    /// </summary>
    public class ExceptionHandlingAttribute : ExceptionFilterAttribute
    {
        /// <summary>
        /// 統一對調用異常信息進行處理,返回自定義的異常信息
        /// </summary>
        /// <param name="context">HTTP上下文對象</param>
        public override void OnException(HttpActionExecutedContext context)
        {
            //自定義異常的處理
            MyApiException ex = context.Exception as MyApiException;
            if (ex != null)
            {
                //記錄關鍵的異常信息
                LogHelper.Error(context.Exception);

                throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.InternalServerError)
                {
                    //封裝處理異常信息,返回指定JSON對象
                    Content = new StringContent(new BaseResultJson(ex.Message, false, ex.errcode).ToJson()),
                    ReasonPhrase = "Exception"
                });
            }            
            
            //常規異常的處理
            string msg = string.IsNullOrEmpty(context.Exception.Message) ? "介面出現了錯誤,請重試或者聯繫管理員" : context.Exception.Message;
            throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.InternalServerError)
            {
                Content = new StringContent(msg),
                ReasonPhrase = "Critical Exception"
            });
        }
    }

3)小程式端代碼處理

小程式端主要是通過JS代碼進行處理,實現數據的獲取及提交處理等。

如我們列舉一個代表性的POST處理代碼,如下所示。

  //測試POst方法
  wx.request({
    url: 'http://localhost:27206/api/SmallApp/Test/TestPostObject',
    data: { 
      msg : '測試內容', 
      item: {Text :'Text', Value:'testValue'}
    },
    header: {'Content-Type': 'application/json' },
    method: 'POST',
    success: function (res) {
      console.log(res.data);
    }
  });

而對於GET方式,我們的小程式調用方式如下所示。

  getFilms: function(start) {
    console.log('start:' + start);
    var that = this

    wx.request({
      url: 'http://www.iqidi.com/api/h5/test/movies',
      data: {
        offset: start,
        type: 'hot',
        limit: that.data.limit
      },
      header: {
          'Content-Type': 'application/json'
      },
      success: function (res) {
        console.log(res.data)

        var data = res.data.data;
        console.log(data);
        if (data.movies.length === 0) {
          that.setData({
            hasMore: false,
            hideLoading :true,
          })
        } 
        else {
          that.setData({
            films: that.data.films.concat(data.movies),
            start: that.data.start + data.movies.length,
            hasMore: true,
            hideLoading :true,
          });
        }
      }
    })

以上就是我們常規介面(單個參數或者多個參數,簡單對象和複雜對象的處理)的定義代碼,希望讀者在開發Web API介面的時候,可以有所幫助。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 作為一個運維 不是你懂多少知識才是你的價值 你有幸能遇到多少錯誤才是你的最大的價值 知識 你有我有大家有 錯誤我有你沒有 這便是我的價值 我遇到一個錯誤 蠻難遇到的一個錯誤 所以想分享給大家 下麵我在模擬機演示給大家 用 root許可權 避免你們說是因為許可權的錯誤 2017年9月5日 我在切換sftp ...
  • 1 什麼是TLS 原理在網上資料很多,這裡不展開。 簡單點說,動態申請的每線程變數。有一類比較熟悉的每線程變數是一個帶__thread的每線程變數,兩者的區別在於,TLS這類每線程變數是動態申請的。有以下一系列介面: #include <pthread.h> int pthread_key_crea ...
  • 說明:文章所有內容截選自實驗樓教程 "【Vim編輯器】" ~ Vim 快速入門 一、實驗介紹 1.1 實驗內容 本次實驗將學習vim中的不同模式和一些基本操作。 1.2 實驗知識點 + Vim中的六種基本模式 + Vim中的基本操作 1.3 課程來源 "VIM 線上手冊" 二、實驗步驟 2.1 vi ...
  • 本文中的提到GNU擴展時,表示該功能是GNU為sed提供的(即GNU版本的sed才有該功能),一般此時都會說明:如果要寫具有可移植性的腳本,應儘量避免在腳本中使用該選項。 本文中的正則表達式幾乎和grep中支持的一樣。但還是有少數幾個是sed自身才能解析的表達式。因此本譯文中只對這些sed自身才支持 ...
  • Ubuntu安裝坑: 1、對於新手第一次安裝ubuntu,特殊情況會出現因為解析度問題導致安裝界面不全,無法進行下一步操作。 解決方案:使用alt+滑鼠左鍵拖動屏幕Linux文件名亂碼問題: 2、因為windows對於中文的編碼預設使用GBK,而linux系統上統一使用UTF-8進行編碼,這就導致大 ...
  • 回到目錄 對於業務層的程式的致命錯誤,我們一直的做法就是直接拋出指定的異常,讓程式去終斷,這種做法是對的,因為如果一個業務出現了致命的阻塞的問題,就沒有必要再向上一層一層的返回了,但這時有個問題,直接拋異常,意味著伺服器直接500了,前端如何去顯示,或者如果你是API的服務,如果為前端返回,如果是5 ...
  • 最近在學習百度的開源上傳組件WebUploader,上一篇文章,學習了批量文件上傳,今天學習一下批量圖片上傳,實際上與文件上傳很類似,只是添加了圖片顯示功能,這個功能WebUploader組件中已經提供了。 ...
  • 作為微軟下一代的開源的跨平臺的開發框架, Asp.net core 正在吸引越來越多的開發者基於其構建現代 web 應用。 目前, Azure App Service 也實現了對 asp.net core 的支持。 用戶所開發的 ASP.NET Core Web 應用, 以與通常 Asp.net W ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...