标准化接口系统改造

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

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

//-----------------------------------------------------------------
// 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;
        }
时间: 2024-08-25 03:28:51

标准化接口系统改造的相关文章

EF架构~EF异步改造之路~仓储接口的改造~续

回到目录 在写完仓储接口的改造改造后,总觉得有个代码的坏味道,这种味道源于它的DRP,即重复的代码太多了,即异步操作和同步操作其实只是在insert,update和delete上有所不同,获取数据的方法都是一样的,所以,我最后决定,将异步的接口进行改造,让它更加合理,方法后都加上Async的后缀,看上去也更像是个异步方法,呵. 改造后的异步接口 /// <summary> /// 异步操作 /// 基础的数据操作规范 /// 与ORM架构无关 /// </summary> ///

记一次WMS的系统改造(1)-分析问题

海外落地中的困境? 目前面临主要的问题是"人",仓储系统主要辅助仓储人员进行生产,所以人变了其实一切就都已经变了,系统在海外面临最大的问题就是人变了.? 这套软件是在国内的运营体系下,用国内运营兄弟的设计一点一点打造出来的,虽有人员更替但运营理念和操作经验却被固化在生产环境中代代相传了下来.到国外后,有一些运营的兄弟过去做指导,但是毕竟只是少数人,由国内的人员过去覆盖的岗位只覆盖到大的运营管理层,到仓经理就已经是外籍人员了,更不要说下面的各种主管和操作员了.? 对他们来说库房生产本来就

某科技公司高安全区域门禁系统改造实例

系统描述: 该公司车间生产高机密产品,采用双控式刷卡感应门禁系统控制人员进出.基于双控的原则,首次进入高安全区域须2人三秒内先后刷卡进入,后面人员单人刷卡进出:人员下班离开时,剩下的最后2人同样须三秒内先后刷卡离开:即必须随便保持高安全区域在有人的情况下,人数不得小于2人!目前采用门禁感应器控制,在车间没人的情况下,单人刷卡无法进入:刷卡后门的开启时间为10秒,超过10秒未关闭即会产生报警:车间剩下最后两人时,单人刷卡产生报警,相关报警信息实时传送到保安室并自动记录报警日志. 问题描述: 尾随进

房间计费系统改造—三

房间的改造基本完成.在中三比重建,被推翻后.七然后重建(外观和工厂).再重构,来来回回用了一个月........ 重构机房从绘图画到一半就废弃了.由于对三层不熟.之后.做完了,才敢又一次拾起来画.绘图先从包图開始.宏观上有个了解: (一)重构机房包图: 先前画包图的时候,跟师傅交流.结果被一个师姐给笑话了,由于我觉得:它们各个层之间都是双向箭头的,后来才知道,箭头表示调用关系,B层仅仅能被U层或外观调用,B层不能调用U层,所以不存在双向箭头.大家注意. 在我这次重构中是严格依照上面的图中来的.

接口系统

<<数据同步系统文档>> 数据同步系统主要用作 源系统 和 目标系统 两边系统进行数据的异步通信形式的同步. 主要任务: 源系统以http形式发送报文A给本系统,本系统定时把报文A发送给目标系统. 目标系统进入本系统进行定时任务的配置,本系统根据该配置定时向目标系统触发http请求,让目标系统进行自同步. 章节目录结构: 头部 .HEAD规范..... 正文 .保存数据接口(http通信)..... ...接口.... 其它 定时任务配置 头部 1.HEAD规范 正文 1.保存数据

vb.net版本房收费系统改造

房费制开始重建的最终版本. 前几天.刚刚看完三层的视频,在视频中具体的解说了一个登录功能.天真的我,当时以为三层结构是那么的简单,所以我草草地做完总结之后,就非常快就開始机房收费系统的重构了.但是谁想到.当我一打开编程软件,就让我"碰了一鼻子的灰"!首先是不知道vs 怎么用,其次就是看三层的时候,登录的实例使用C#写的,而这次我们须要用VB.NET写,所以对于当中的语法是知之甚少.尽管,前段时间我看了一遍台湾讲师--曹祖胜的<VB.NET 视频>.可是他讲的差点儿都是一些底

EF异步改造之路~第一回 仓储接口的改造

C#5.0带来了并行编程 {C#1.0托管代码→C#2.0泛型→C#3.0LINQ→C#4.0动态语言→C#5.0异步编程} 随着C#5.0在.net4.5出来之后,它们主推的并行技术也逐渐变得越来越热,这种热量已经传到了我这里,身为仓储大叔的我,一定也对自己的仓储进行并行化的改造,这是大势所趋,呵呵,今天主要是把我的IRepository.Core项目进行扩展,即添加一些对应的并行接口,然后让我的并行(异步)仓储去实现它,事实上,.net的ef这块,实现异步(并行)非常容易,在C#5.0里由于

easyui权限系统改造备忘

修改list.js文件 //// 如果所有操作按钮隐藏,则list-toolbar隐藏 //if ($(".list-toolbar").length > 0) { // var toolbar = $($(".list-toolbar")[0]); // var buttons = toolbar.find("ul").children(); // if (buttons.length != 0) { // var visible = f

实现使用支付宝交易接口实现机构端代理系统的总结

支付宝接口系统设计总结 1        前言 经过1个月的紧张开发,支付宝接口系统项目顺利完工,现在对整个项目的设计方案进行总结,目的是提升一下表达能力,同时为以后的系统设计提供一个参考. 该项目为燃气公司提供使用支付宝代收燃气费的接入服务.数据交换协议由支付宝方规定.系统实现的主要功能包括:用户欠费查询.用户缴费.清算.对账等功能. 由于系统跑在公网上,所以数据传输要求加密传输,支付宝方规定数据通讯采用SSL Socket双向验证通道,对账文件采用sftp数据传输.这也是我首次接触在互联网上