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
- C#与C#接口对接,C#与Java的接口对接(序列化与反序列化)——(一)
- C#与C#接口对接,C#与Java的接口对接(序列化与反序列化)——(二)
- C# 与 dll对接
- JAVA与c#的序列化和反序列化
- c#序列化与反序列化
- C#序列化与反序列化
- C#序列化与反序列化
- c#序列化 与 反序列化
- C#序列化与反序列化
- C# 序列化与反序列化
- C#序列化与反序列化
- C#序列化与反序列化
- C#序列化与反序列化
- C# 序列化与反序列化
- C#序列化与反序列化
- C# 序列化 与 反序列化
- C#序列化与反序列化
- C# 序列化与反序列化
- 【稀饭】react native 实战系列教程之项目初始化
- # Ionic+Angularjs快速创建APP应用
- android5.1+获取当前运行的app(Android5.1-也支持)
- C中memcpy,strcpy,sprintf对一个字符数组赋值的效率
- kafka kafka-clients 0.10.0.0 API
- C#与C#接口对接,C#与Java的接口对接(序列化与反序列化)——(一)
- 某同学的性能测试的问题和答疑
- Mac OS X下Maven的安装与配置
- Xamarin提示Build-tools版本过老
- jsonArrayAndJsonObject
- android学习总结(16.08.26)Activity的launch Mode(启动模式)
- 【稀饭】react native 实战系列教程之首页列表UI实现
- jquery-ui 拖动列表 与 拖拽
- Android事件传递机制