C#与C#接口对接,C#与Java的接口对接(序列化与反序列化)——(一)

来源:互联网 发布:网络歌手红唇橙子 编辑:程序博客网 时间:2024/04/29 10:33

接受数据

1.建立Json请求包的类,其中包括apikey和接受的数据

/// <summary>    /// Json请求数据包    /// </summary>    [DataContract]    public class JsonRequestModel<TData>    {        /// <summary>        /// 请求平台Key        /// </summary>        [DataMember(Name = "apikey")]        public string ApiKey { get; set; }        /// <summary>        /// 请求包中的数据        /// </summary>        [DataMember(Name = "datas")]        public List<TData> Datas { get; set; }    }

2.建立返回给接口的结果类

/// <summary>    /// Json相应数据包    /// </summary>    [DataContract]    public class JsonResponseModel    {        /// <summary>        /// 请求平台Key        /// </summary>        [DataMember(Name = "success")]        public bool Success { get; set; }        /// <summary>        /// 返回代码        /// </summary>        [DataMember(Name = "opCode")]        public int Code { get; set; }        /// <summary>        /// 结果提示        /// </summary>        [DataMember(Name = "result")]        public string Result { get; set; }        /// <summary>        /// 返回状态        /// </summary>        [IgnoreDataMember]        public ReponseState State        {            get { return (ReponseState)Code; }            set { Code = (int)value; }        }    }    /// <summary>    /// 返回数据状态    /// </summary>    public enum ReponseState    {        /// <summary>        /// 成功        /// </summary>        Success = 200,        /// <summary>        /// 系统错误        /// </summary>        SystemError = -500,        /// <summary>        /// 数据是空的        /// </summary>        Empty = -30001,        /// <summary>        /// 数据格式错误,不是指定的Json数据        /// </summary>        FormatError = -30002,        /// <summary>        /// APIKEY为空        /// </summary>        ApiKeyEmpty = -30101,        /// <summary>        /// APIKEY 错误        /// </summary>        ApiKeyError = -30102,        /// <summary>        /// APIKEY与预留的主机地址不匹配        /// </summary>        ApiKeyIpNotMatched = -30103,        /// <summary>        /// APIKEY 过时        /// </summary>        ApiKeyTimeOut = -30104,        /// <summary>        /// 保存数据异常,数据类型错误        /// </summary>        DataError = -30105,        /// <summary>        /// 正在备案,不能更新数据        /// </summary>        CanNotUpdateWhenFlow = -40001,        /// <summary>        /// 请求参数错误        /// </summary>        RquestParameterError=50001,        /// <summary>        /// 工作流配置错误,无法启动工作流        /// </summary>        FlowConfigrationError=60001    }

2.建立字符串的序列化与反序列化转换规则的类

 public static class JsonSerializer    {        #region 字符串序列化与反序列化        /// <summary>        /// Json反序列化        /// </summary>        /// <typeparam name="T">反序列化后的类型</typeparam>        /// <param name="data">待反序列化的字符串</param>        /// <returns></returns>        public static T Deserializer<T>(string data) where T : class        {            //JSON反序列化            DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(T), new DataContractJsonSerializerSettings()            {                DateTimeFormat = new DateTimeFormat("yyyy-MM-dd HH:mm:ss")            });            byte[] buffer = Encoding.UTF8.GetBytes(data);            T data1;            using (MemoryStream stream = new MemoryStream(buffer))            {                data1 = serializer.ReadObject(stream) as T;            }            return data1;        }        /// <summary>        /// Json序列化        /// </summary>        /// <param name="itemData">待序列化的数据</param>        /// <returns>序列化后的字符串</returns>        public static string Serializer(object data)        {            string result = null;            DataContractJsonSerializer json = new DataContractJsonSerializer(data.GetType(), new DataContractJsonSerializerSettings()            {                DateTimeFormat = new DateTimeFormat("yyyy-MM-dd HH:mm:ss")            });            //序列化            using (MemoryStream stream = new MemoryStream())            {                json.WriteObject(stream, data);                string szJson = Encoding.UTF8.GetString(stream.ToArray());                result = szJson;            }            return result;        }        #endregion    }

3.控制器基类

    /// <summary>    /// 外部接口控制器基类    /// </summary>    public class ExternalBaseController : Controller    {        public string TranPlatformCode { get; set; }        /// <summary>        /// 返回请求的数据包并反序列化为对象        /// </summary>        /// <typeparam name="TData"></typeparam>        /// <returns></returns>        protected JsonRequestModel<TData> GetRequestData<TData>()        {            try            {                //读取请求的数据包,将数据包反序列化                Stream requestStream = this.Request.InputStream;                string requestJson = null;                using (System.IO.StreamReader reader = new System.IO.StreamReader(requestStream))                {                    requestJson = reader.ReadToEnd();                }                //string file = System.IO.Path.Combine(Server.MapPath("/Log"), "JsonData.txt");                //System.IO.File.AppendAllText(file, "=============================");                //System.IO.File.AppendAllText(file, DateTime.Now.ToString());                //System.IO.File.AppendAllText(file, typeof(TData).Name);                //System.IO.File.AppendAllText(file, "=***************************=");                //System.IO.File.AppendAllText(file, requestJson);                JsonRequestModel<TData> requestData = UtilityCommon.JsonSerializer.Deserializer<JsonRequestModel<TData>>(PreProcessJson(requestJson));                return requestData;            }catch(Exception e)            {                throw new ExtendDataErrorException("反序列化错误"+e.Message);            }        }       //适用于与java数据接口对接        protected JsonRequestModel<TData> GetRequestDataUrl<TData>()        {            //读取请求的数据包,将数据包反序列化            Stream requestStream = this.Request.InputStream;            string requestJson = null;            using (System.IO.StreamReader reader = new System.IO.StreamReader(requestStream))            {                requestJson = reader.ReadToEnd();            }            //string file = System.IO.Path.Combine(Server.MapPath("/Log"), "JsonData.txt");            //System.IO.File.AppendAllText(file, "=============================");            //System.IO.File.AppendAllText(file, DateTime.Now.ToString());            //System.IO.File.AppendAllText(file, typeof(TData).Name);            //System.IO.File.AppendAllText(file, "=***************************=");            //System.IO.File.AppendAllText(file, requestJson);            string code = HttpUtility.UrlDecode(requestJson,System.Text.Encoding.UTF8).Substring(8);            JsonRequestModel<TData> requestData = UtilityCommon.JsonSerializer.Deserializer<JsonRequestModel<TData>>(PreProcessJson(code));            return requestData;        }        /// <summary>        /// Json字符串预处理        /// </summary>        /// <param name="jsonString">源Json字符串</param>        /// <returns>预处理后的json字符串</returns>        private string PreProcessJson(string jsonString)        {            return jsonString                .Replace("\"False\"", "\"false\"")                .Replace("\"True\"", "\"true\"")                .Replace("\t", "").Replace("\r","")                .Replace("/","\\/").Replace("\n","");        }        /// <summary>        /// 检查apiKey是否正确        /// </summary>        /// <param name="apiKey"></param>        /// <returns></returns>        protected void CheckApiKey(string apiKey)        {            if (string.IsNullOrEmpty(apiKey))                throw new ExtendApiKeyEmptyException("ApiKey为空");            //TODO:取交易平台编码,暂时返回一个固定值            TranPlatformCode = "001";        }        /// <summary>        /// 保存提交的数据        /// </summary>        protected virtual async Task SaveRequestData()        {        }        /// <summary>        /// 处理返回给调用者的数据        /// </summary>        /// <returns></returns>        protected virtual async Task<JsonResponseModel> ResponseData()        {            JsonResponseModel response = new JsonResponseModel            {                Success = true,                State = ReponseState.Success,                Result = "数据提交成功"            };            try            {                await SaveRequestData();            }            catch (ExtendApiKeyEmptyException ex)            {                response.Success = false;                response.State = ReponseState.ApiKeyEmpty;                response.Result = ex.Message;            }            catch (ExtendApiKeyErrorException ex)            {                response.Success = false;                response.State = ReponseState.ApiKeyError;                response.Result = ex.Message;            }            catch (ExtendApiKeyIpNotMatchedException ex)            {                response.Success = false;                response.State = ReponseState.ApiKeyError;                response.Result = ex.Message;            }            catch (ExtendApiKeyTimeOutException ex)            {                response.Success = false;                response.State = ReponseState.ApiKeyError;                response.Result = ex.Message;            }            catch (ExtendApiKeyException ex)            {                response.Success = false;                response.State = ReponseState.ApiKeyError;                response.Result = ex.Message;            }            catch (ExtendUpdateWhenFlowException ex)            {                response.Success = false;                response.State = ReponseState.CanNotUpdateWhenFlow;                response.Result = ex.Message;            }            catch (ExtendDataErrorException ex)            {                response.Success = false;                response.State = ReponseState.DataError;                response.Result = ex.Message;            }            catch (ExtendFlowException ex)            {                response.Success = false;                response.State = ReponseState.DataError;                response.Result = ex.Message;            }            catch (ExtendException ex)            {                response.Success = false;                response.State = ReponseState.SystemError;                response.Result = ex.Message;            }            catch (Exception ex)            {                string message = ex.Message;                response.Success = false;                response.State = ReponseState.SystemError;                response.Result = ex.Message;            }            return response;        }        //子类可实现的存储方法        public virtual async Task<ActionResult> Save()        {            return Content(UtilityCommon.JsonSerializer.Serializer(await ResponseData()));        }

4.继承上面的控制器类即可

//requestData的数据已是对象,可直接保存 JsonRequestModel<Goods> requestData = GetRequestData<Goods>();                CheckApiKey(requestData.ApiKey);
0 0