从零开始搭建前后端分离的NetCore2.2(EF Core CodeFirst+Autofac)+Vue的项目框架之三统一返回数据
在 上一篇 中讲到如何通过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 哦,谢谢!
-------------------------------------------------------------------------------------------------------------------------------------------------------------
学习本是一个不断模仿、练习、创新、超越的过程。 由于博主能力有限,文中可能存在描述不正确,欢迎指正、补充! 感谢您的阅读,麻烦动动手指点个推荐哟。
-------------------------------------------------------------------------------------------------------------------------------------------------------------
学习本是一个不断模仿、练习、创新、超越的过程。 由于博主能力有限,文中可能存在描述不正确,欢迎指正、补充! 感谢您的阅读,麻烦动动手指点个推荐哟。
-------------------------------------------------------------------------------------------------------------------------------------------------------------
作者:Levy-伟
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。