在 上一篇 中講到如何通過autofac將DbContext和model進行解耦,只用添加model,而不用在DbContext中添加DbSet。這一篇將講到如何統一后端返回數據模型。
首先我們得明白一般后端應該返回給前端一些什么數據。根據我所接觸到的開放平台接口以及自己平常所涉及到的知識。
大概總結了一下幾個點,一得有返回的狀態碼,二得有返回的狀態信息,三得有返回的數據值。
如果說是有錯誤的情況下,應當返回錯誤模型,錯誤模型包括錯誤編碼及錯誤簡介。錯誤編碼是為了提供給使用接口的人查找該錯誤編碼的解決方式,錯誤簡介則是告知這大概是什么樣的錯誤。
該節中需要使用到前面已經封裝好的靜態擴展方法,傳送門 請自行選擇添加!!
- 在CoreMvc項目下新建返回模型類 ResponseResult 內容如下:
/// <inheritdoc /> /// <summary> /// 響應返回體 /// </summary> public class ResponseResult : ResponseResult<object> { } /// <summary> /// 響應返回體 /// </summary> /// <typeparam name="T"></typeparam> public class ResponseResult<T> : BaseResponseResult { public T Data { get; set; } public ResponseResult<T> Fail(int code, string msg, T data) { Code = code; Message = msg; Data = data; return this; } public ResponseResult<T> Succeed(T data, int code = 200, string msg = "successful") { Code = code; Message = msg; Data = data; return this; } } public class BaseResponseResult { public int Code { get; set; } public string Message { get; set; } public bool Success => Code == 200;//自定義成功狀態碼為200 }
- 新建自定義返回給前端的Json結果數據類 CustomJsonResult ,需繼承 ActionResult 內容如下:
/// <summary> /// 自定義返回Json數據 /// </summary> public class CustomJsonResult : ActionResult { public object Data { get; set; } public string DateTimeFormat { get; set; } = "yyyy-MM-dd HH:mm:ss"; public override void ExecuteResult(ActionContext context) { if (context == null) throw new ArgumentNullException(nameof(context)); var response = context.HttpContext.Response; response.ContentType = "application/json"; if (Data == null) return; if (string.IsNullOrEmpty(DateTimeFormat)) { DateTimeFormat = "yyyy-MM-dd HH:mm:ss"; } string json; #if DEBUG json = Data.ToJson(true, true, true, DateTimeFormat);//方便調式 #else json = Data.ToJson(true, false, true, DateTimeFormat); #endif var data = Encoding.UTF8.GetBytes(json); response.Body.Write(data, 0, data.Length); } }
- 新建自定義返回給前端的Json結果數據類(包含HTTP狀態碼) CustomHttpStatusCodeResult ,需繼承 ActionResult 內容如下:
/// <summary> /// 返回帶有HTTP狀態碼的json結果 /// </summary> public class CustomHttpStatusCodeResult : ActionResult { public int StatusCode { get; } public string Data { get; } public CustomHttpStatusCodeResult(int httpStatusCode, int msgCode, string content = "", object data = null) { StatusCode = httpStatusCode; Data = new ResponseResult().Fail(msgCode, content ?? "", data ?? "").ToJson(true, isLowCase: true); } public override void ExecuteResult(ActionContext context) { if (context == null) throw new ArgumentNullException(nameof(context)); context.HttpContext.Response.StatusCode = StatusCode; if (string.IsNullOrEmpty(Data)) return; context.HttpContext.Response.ContentType = "application/json"; var bytes = Encoding.UTF8.GetBytes(Data); context.HttpContext.Response.Body.Write(bytes, 0, bytes.Length); } }
- 新建 BaseController 用來封裝返回數據以及獲取參數等方法,需繼承 Controller 內容如下:
public abstract class BaseController : Controller { /// <summary> /// 從 Request.Body 中獲取數據並JSON序列化成對象 /// </summary> /// <typeparam name="T"></typeparam> /// <returns></returns> protected T GetJsonParams<T>() { if (Request.ContentLength != null) { var bytes = new byte[(int)Request.ContentLength]; Request.Body.Read(bytes, 0, bytes.Length); var json = Encoding.UTF8.GetString(bytes); return json.ToNetType<T>(); } return default(T); } /// <summary> /// 返回Json數據 /// </summary> /// <param name="data"></param> /// <returns></returns> protected ActionResult MyJson(BaseResponseResult data) { return new CustomJsonResult { Data = data, DateTimeFormat = "yyyy-MM-dd HH:mm:ss" }; } /// <summary> /// 返回成功 /// Json格式 /// </summary> /// <returns></returns> protected ActionResult Succeed() { return Succeed(true); } /// <summary> /// 返回成功 /// Json格式 /// </summary> /// <param name="data"></param> /// <returns></returns> protected ActionResult Succeed(object data) { return MyJson(new ResponseResult().Succeed(data)); } [ApiExplorerSettings(IgnoreApi = true)] public ActionResult Fail(int code, string content = "", string desc = null) { return MyJson(new ResponseResult().Fail(code, content + " " + desc, "") ); } [ApiExplorerSettings(IgnoreApi = true)] public override void OnActionExecuting(ActionExecutingContext context) { base.OnActionExecuting(context); } [ApiExplorerSettings(IgnoreApi = true)] public override void OnActionExecuted(ActionExecutedContext context) { } }
在這里就基本已經完成了返回數據的統一了,在每個控制器上都繼承 BaseController 類,然后再返回數據的時候直接使用。
- return Succeed(new string[] { "value1"}); 返回成功消息。
- return Fail(1001,"錯誤返回示例");//1001為自己自定義錯誤碼 返回錯誤消息
- var response = new ResponseResult(); response.Succeed("成功消息"); return MyJson(response); 自定義需要返回結果
- var requestStr = GetJsonParams<string>(); 可使用此語句從請求Body中取出數據,方便使用。
也可定義相對應模型使用 [FromBody] 從請求Body中獲取:如 [FromBody]DemoModel demo ,前端傳的數據:{Id:1, CustomerName:"levy",IdentityCardType: 1}
在下一篇中將介紹如何使用Nlog來記錄日志,並存至sqlserver數據庫。
有需要源碼的可通過此 GitHub 鏈接拉取 覺得還可以的給個 start 哦,謝謝!