標準化接口系統改造

標準接口在系統設計過程當中發揮着重要的做用,特別是在各個平臺的交互中,統一規範的接口標準大大減小了開發人員的工做時間。下面讓咱們來開開通用權限管理系統的標準接口web

標準化接口輸出改造 標準輸出類:

//-----------------------------------------------------------------
// All Rights Reserved , Copyright (C) 2016 , Hairihan TECH, Ltd.  
//-----------------------------------------------------------------

using System;

namespace DotNet.Utilities
{
    /// <summary>
    /// BaseResult  JsonResult<T>
    /// 
    /// 修改記錄
    /// 
    ///        2016.08.19 版本:2.2 SongBiao 增長 公共方法 方法。
    ///        2016.05.12 版本:2.1 JiRiGaLa 增長 Signature 數字簽名。
    ///        2016.01.07 版本:2.0 JiRiGaLa 增長 RecordCount。
    ///        2015.11.16 版本:1.1 SongBiao 增長JsonResult<T> 泛型 能夠帶數據返回。
    ///        2015.09.16 版本:1.1 JiRiGaLa Result 修改成 Status。
    ///        2015.09.15 版本:1.0 JiRiGaLa 添加返回標準定義。
    ///        
    /// <author>
    ///        <name>JiRiGaLa</name>
    ///        <date>2016.05.12</date>
    /// </author> 
    /// </summary>
    [Serializable]
    public class BaseResult
    {
        /// <summary>
        /// 操做是否成功
        /// 2015-09-16 吉日嘎拉 按宋彪建議進行修正
        /// </summary>
        public bool Status = false;

        /// <summary>
        /// 返回值
        /// </summary>
        public string ResultValue = "";

        /// <summary>
        /// 返回狀態代碼
        /// </summary>
        public string StatusCode = "UnknownError";

        /// <summary>
        /// 返回消息內容
        /// </summary>
        public string StatusMessage = "未知錯誤";

        /// <summary>
        /// 查詢分頁數據時返回記錄條數用
        /// </summary>
        public int RecordCount = 0;

        /// <summary>
        /// 數字簽名(防止篡改)
        /// </summary>
        public string Signature = string.Empty;

        /// <summary>
        /// 默認是返回成功的結果
        /// 2016-08-02 吉日嘎拉改進
        /// </summary>
        public BaseResult()
        {
            this.Status = true;
            this.StatusCode = Utilities.Status.OK.ToString();
            this.StatusMessage = Utilities.Status.OK.ToDescription();
        }


        /// <summary>
        /// 對登陸的用戶進行數字簽名
        /// </summary>
        /// <param name="userInfo">登陸信息</param>
        /// <returns>進行過數字簽名的用戶登陸信息</returns>
        public string CreateSignature(BaseUserInfo userInfo)
        {
            if (userInfo != null)
            {
                if (!string.IsNullOrEmpty(userInfo.Signature))
                {
                    // 須要簽名的內容部分
                    string dataToSign = userInfo.Signature + "_"
                        + ResultValue + "_"
                        + Status + "_"
                        + StatusCode + "_"
                        + BaseSystemInfo.SecurityKey + "_";
                    // 進行簽名
                    Signature = SecretUtilBase.md5(dataToSign);
                }
            }

            return Signature;
        }

        /// <summary>
        /// 對登陸的用戶進行數字簽名
        /// </summary>
        /// <param name="userInfo">登陸信息</param>
        /// <returns>進行過數字簽名的用戶登陸信息</returns>
        public bool VerifySignature(BaseUserInfo userInfo)
        {
            bool result = false;

            if (userInfo != null)
            {
                if (!string.IsNullOrEmpty(userInfo.Signature))
                {
                    // 須要簽名的內容部分
                    string dataToSign = userInfo.Signature + "_"
                        + ResultValue + "_"
                        + Status + "_"
                        + StatusCode + "_"
                        + BaseSystemInfo.SecurityKey + "_";
                    // 進行簽名
                    result = Signature == SecretUtilBase.md5(dataToSign);
                }
            }

            return result;
        }

        /// <summary>
        /// 輸出成功消息
        /// </summary>
        /// <returns></returns>
        public static BaseResult Success(string message = null)
        {
            return new BaseResult()
            {
                Status = true,
                StatusMessage = message ?? "操做成功"
            };
        }

        /// <summary>
        /// 輸出失敗消息
        /// </summary>
        /// <returns></returns>
        public static BaseResult Fail(string message = null)
        {
            return new BaseResult()
            {
                Status = false,
                StatusMessage = message ?? "操做失敗"
            };
        }

        /// <summary>
        /// 輸出錯誤消息
        /// </summary>
        /// <returns></returns>
        public static BaseResult Error(string message = null)
        {
            return new BaseResult()
            {
                Status = false,
                StatusMessage = message ?? "系統錯誤"
            };
        }


        /// <summary>
        /// 輸出異常消息
        /// </summary>
        /// <returns></returns>
        public static BaseResult Exception(string message = null)
        {
            return new BaseResult()
            {
                Status = false,
                StatusMessage = message ?? "系統異常"
            };
        }

    }

    /// <summary>
    /// Json格式帶返回數據
    /// </summary>
    /// <typeparam name="T"></typeparam>
    [Serializable]
    public class JsonResult<T> : BaseResult
    {
        public T Data { get; set; }

    }
}

從上面類能夠看出,根據需求接口能夠輸出帶數據的信息。json

接口序列化幫助類:

    /// <summary>
    /// Json相關擴展方法。
    /// 
    /// 修改紀錄
    /// 
    /// 2016-08-22 版本:1.0 LiuHaiYang 建立文件。
    /// 
    /// <author>
    ///     <name>LiuHaiYang</name>
    ///     <date>2016-08-22</date>
    /// </author>
    /// </summary>

    /// <summary>
    /// Json相關擴展方法。
    /// </summary>
    public static class  JsonUtil
    {
        static JavaScriptSerializer serializer = new JavaScriptSerializer();
        #region Json擴展
        /// <summary>
        /// 將對象轉換爲Json字串。
        /// </summary>
        /// <typeparam name="T">類型</typeparam>
        /// <param name="obj">對象實例。</param>
        /// <returns>Json字串</returns>
        public static string ToJson<T>(this T obj)
        {
            string ret = "";
            if (obj is string)
            {
                ret = obj.ToString();
            }
            else
            {
                //StringExtensions.ToJson(obj); 這個不能夠 解析嵌套類
                ret = serializer.Serialize(obj);
            }
            return ret;
        }

        /// <summary>
        /// 將Json字符串轉換爲Json對象。
        /// </summary>
        /// <typeparam name="T">類型</typeparam>
        /// <param name="json">Json字符串。</param>
        /// <returns>Json對象</returns>
        public static T FromJson<T>(this string json)
        {
            //return StringExtensions.FromJson<T>(json);  這個不能夠 解析嵌套類
            return serializer.Deserialize<T>(json);
        }
        #endregion
    }

調用舉例:

一、經過接口獲取一個實體信息緩存

        /// <summary>
        /// 獲取區域實體
        /// </summary>
        /// <param name="context"></param>
        private void GetObject(HttpContext context)
        {
            JsonResult<BaseAreaEntity> jsonResult = new JsonResult<BaseAreaEntity>();
            try
            {
                if (context.Request["id"] != null)
                {
                    string id = context.Request["id"].ToString();
                    bool encrypted = false;
                    if (context.Request["encrypted"] != null)
                    {
                        encrypted = context.Request["encrypted"].Equals(true.ToString(), StringComparison.OrdinalIgnoreCase);
                    }
                    if (encrypted)
                    {
                        id = SecretUtil.Decrypt(id);
                    }
                    // BaseAreaManager areaManager = new BaseAreaManager();
                    // result = areaManager.GetObject(id);
                    // 2015-11-29 吉日嘎拉 從緩存獲取數據,提升效率
                    BaseAreaEntity model = BaseAreaManager.GetObjectByCache(id);
                    jsonResult.Status = true;
                    jsonResult.RecordCount = 1;
                    jsonResult.StatusMessage = "獲取成功。";
                    jsonResult.Data = model;
                }
            }
            catch (Exception ex)
            {
                jsonResult.Status = false;
                jsonResult.StatusMessage = "異常:" + ex.Message;
            }

            string result = jsonResult.ToJson();
            context.Response.Write(result);
        }

二、調用這個接口服務器

        /// <summary>
        /// 獲取區域
        /// </summary>
        /// <param name="userInfo"></param>
        /// <param name="id"></param>
        /// <returns></returns>
        public static BaseAreaEntity GetObject(BaseUserInfo userInfo, string id)
        {
            BaseAreaEntity result = null;

            string url = BaseSystemInfo.UserCenterHost + "/UserCenterV46/AreaService.ashx";
            WebClient webClient = new WebClient();
            NameValueCollection postValues = new NameValueCollection();
            postValues.Add("system", BaseSystemInfo.SoftFullName);
            postValues.Add("systemCode", BaseSystemInfo.SystemCode);
            postValues.Add("securityKey", BaseSystemInfo.SecurityKey);
            // 2015-11-25 吉日嘎拉,這裏仍是從緩存裏獲取就能夠了,提升登陸的效率。
            postValues.Add("function", "GetObject");
            postValues.Add("userInfo", userInfo.Serialize());
            postValues.Add("encrypted", true.ToString());
            postValues.Add("id", SecretUtil.Encrypt(id));
            // 向服務器發送POST數據
            byte[] responseArray = webClient.UploadValues(url, postValues);
            string response = Encoding.UTF8.GetString(responseArray);
            if (!string.IsNullOrEmpty(response))
            {
                JsonResult<BaseAreaEntity> jsonResult = response.FromJson<JsonResult<BaseAreaEntity>>() as JsonResult<BaseAreaEntity>;
                if (jsonResult != null)
                {
                    result = jsonResult.Data;
                }
            }

            return result;
        }
相關文章
相關標籤/搜索