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