标准化接口系统改造
标准接口在系统设计过程中发挥着重要的作用,特别是在各个平台的交互中,统一规范的接口标准大大减少了开发人员的工作时间。下面让我们来开开通用权限管理系统的标准接口
标准化接口输出改造 标准输出类:
//----------------------------------------------------------------- // 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; }