标准化接口系统改造

标准接口在系统设计过程中发挥着重要的作用,特别是在各个平台的交互中,统一规范的接口标准大大减少了开发人员的工作时间。下面让我们来开开通用权限管理系统的标准接口

标准化接口输出改造 标准输出类:

//-----------------------------------------------------------------
// 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; }

    }
}

从上面类可以看出,根据需求接口可以输出带数据的信息。

接口序列化帮助类:

    /// <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
    }

调用举例:

1、通过接口获取一个实体信息

        /// <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);
        }

2、调用这个接口

        /// <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;
        }
原文地址:https://www.cnblogs.com/hnsongbiao/p/5798758.html