WebApi返回数据我们一般包裹在一个公共的模型下面的,而不是直接返回最终数据,在返回参数中,显示出当前请求的时间戳,是否请求成功,如果错误那么错误的消息是什么,状态码(根据业务定义的值)等等。我们常规的返回值常需要如下字段,为此我们可以先定义IResultDto 接口

/// <summary>
/// 结果模型
/// </summary>
public interface IResultDto
{
/// <summary>
/// 成功
/// </summary>
bool Successful { get; set; } /// <summary>
/// 返回标识码
/// </summary>
int Code { get; set; } /// <summary>
/// 操作码(用于幂等性验证,每次请求都会返回一个新的,以便用户下次更新使用)
/// </summary>
string OpCode { get; set; } /// <summary>
/// 消息
/// </summary>
string Msg { get; set; } /// <summary>
/// 常规数据
/// </summary>
dynamic Data { get; set; } }
/// <summary>
/// 结果模型
/// </summary>
public interface IResultDto
{
/// <summary>
/// 成功
/// </summary>
bool Successful { get; set; } /// <summary>
/// 返回标识码
/// </summary>
int Code { get; set; } /// <summary>
/// 操作码(用于幂等性验证,每次请求都会返回一个新的,以便用户下次更新使用)
/// </summary>
string OpCode { get; set; } /// <summary>
/// 消息
/// </summary>
string Msg { get; set; } /// <summary>
/// 常规数据
/// </summary>
dynamic Data { get; set; } }

对应的还接口的实现如下,为了更好的独立性,在这里实现了成功和失败赋值方法。

/// <summary>
/// 返回模型
/// </summary>
public class ResultDto : IResultDto
{
/// <summary>
/// 返回标识码
/// </summary>
public int Code { get; set; } /// <summary>
/// 成功
/// </summary>
[JsonIgnore]
public bool Successful { get; set; } /// <summary>
/// 消息
/// </summary>
public string Msg { get; set; } /// <summary>
/// 操作码(用于幂等性验证,每次请求都会返回一个新的,以便用户下次更新使用)
/// </summary>
public string OpCode { get; set; } /// <summary>
/// 常规数据
/// </summary>
public dynamic Data { get; set; } /// <summary>
/// 成功
/// </summary>
/// <returns></returns>
public ResultDto Success(string msg = "success")
{
this.Code = (int)EnumCode.Succeed;
this.Successful = true;
this.Msg = msg;
return this;
} /// <summary>
/// 成功
/// </summary>
/// <param name="data"></param>
/// <param name="msg"></param>
/// <returns></returns>
public ResultDto Success(dynamic data = default, string msg = "success")
{
this.Code = (int)EnumCode.Succeed;
this.Successful = true;
this.Data = data;
this.Msg = msg;
return this;
} /// <summary>
/// 成功
/// </summary>
/// <param name="data"></param>
/// <param name="msg"></param>
/// <returns></returns>
public ResultDto Success(dynamic data = default, dynamic data2 = default, string msg = "success")
{
this.Code = (int)EnumCode.Succeed;
this.Successful = true;
this.Data = data;
this.Msg = msg;
return this;
} /// <summary>
/// 失败
/// </summary>
/// <param name="code"></param>
/// <param name="msg">说明</param>
public ResultDto Failed(int code = default, string msg = "failed")
{
this.Code = code;
this.Successful = false;
this.Msg = msg;
return this;
} }
/// <summary>
/// 返回模型
/// </summary>
public class ResultDto : IResultDto
{
/// <summary>
/// 返回标识码
/// </summary>
public int Code { get; set; } /// <summary>
/// 成功
/// </summary>
[JsonIgnore]
public bool Successful { get; set; } /// <summary>
/// 消息
/// </summary>
public string Msg { get; set; } /// <summary>
/// 操作码(用于幂等性验证,每次请求都会返回一个新的,以便用户下次更新使用)
/// </summary>
public string OpCode { get; set; } /// <summary>
/// 常规数据
/// </summary>
public dynamic Data { get; set; } /// <summary>
/// 成功
/// </summary>
/// <returns></returns>
public ResultDto Success(string msg = "success")
{
this.Code = (int)EnumCode.Succeed;
this.Successful = true;
this.Msg = msg;
return this;
} /// <summary>
/// 成功
/// </summary>
/// <param name="data"></param>
/// <param name="msg"></param>
/// <returns></returns>
public ResultDto Success(dynamic data = default, string msg = "success")
{
this.Code = (int)EnumCode.Succeed;
this.Successful = true;
this.Data = data;
this.Msg = msg;
return this;
} /// <summary>
/// 成功
/// </summary>
/// <param name="data"></param>
/// <param name="msg"></param>
/// <returns></returns>
public ResultDto Success(dynamic data = default, dynamic data2 = default, string msg = "success")
{
this.Code = (int)EnumCode.Succeed;
this.Successful = true;
this.Data = data;
this.Msg = msg;
return this;
} /// <summary>
/// 失败
/// </summary>
/// <param name="code"></param>
/// <param name="msg">说明</param>
public ResultDto Failed(int code = default, string msg = "failed")
{
this.Code = code;
this.Successful = false;
this.Msg = msg;
return this;
} }

我们尝试返回该类型结果

 return ResultTo.Success(tokenDto, "登录成功");

通过swagger文档我们看下返回效果

细心的你是不是发现了啥,我们的接口文档他不认识我们返回类型的实体呀,还玩啥,别急我们可以再稍微扩展下,加个泛型的返回,看起来就完美了。

   /// <summary>
/// 泛型结果模型
/// </summary>
/// <typeparam name="T"></typeparam>
public interface IResultDto<T> : IResultDto
{
/// <summary>
/// 常规数据
/// </summary>
new T Data { get; set; } }
    /// <summary>
/// 泛型结果模型
/// </summary>
/// <typeparam name="T"></typeparam>
public interface IResultDto<T> : IResultDto
{
/// <summary>
/// 常规数据
/// </summary>
new T Data { get; set; } }

我们实现泛型接口如下,同样在这里实现了成功和失败赋值方法。

/// <summary>
/// 泛型类 返回模型
/// </summary>
/// <typeparam name="T"></typeparam>
public class ResultDto<T> : ResultDto, IResultDto<T>
{
/// <summary>
/// 常规数据
/// </summary>
public new T Data { get; set; } /// <summary>
/// 成功
/// </summary>
/// <param name="data"></param>
/// <param name="msg"></param>
/// <returns></returns>
public ResultDto<T> Success(T data = default, string msg = "success")
{
this.Code = (int)EnumCode.Succeed;
this.Successful = true;
this.Data = data;
this.Msg = msg;
return this;
} /// <summary>
/// 异常
/// </summary>
/// <param name="data"></param>
/// <param name="msg"></param>
/// <returns></returns>
public ResultDto<T> Failed(string msg = "err")
{
this.Code = (int)EnumCode.Err;
this.Successful = false;
this.Msg = msg;
return this;
} /// <summary>
/// 异常
/// </summary>
/// <param name="data"></param>
/// <param name="msg"></param>
/// <returns></returns>
public ResultDto<T> Failed(string msg, int enumCode)
{
this.Code = enumCode;
this.Successful = false;
this.Msg = msg;
return this;
} }
/// <summary>
/// 泛型类 返回模型
/// </summary>
/// <typeparam name="T"></typeparam>
public class ResultDto<T> : ResultDto, IResultDto<T>
{
/// <summary>
/// 常规数据
/// </summary>
public new T Data { get; set; } /// <summary>
/// 成功
/// </summary>
/// <param name="data"></param>
/// <param name="msg"></param>
/// <returns></returns>
public ResultDto<T> Success(T data = default, string msg = "success")
{
this.Code = (int)EnumCode.Succeed;
this.Successful = true;
this.Data = data;
this.Msg = msg;
return this;
} /// <summary>
/// 异常
/// </summary>
/// <param name="data"></param>
/// <param name="msg"></param>
/// <returns></returns>
public ResultDto<T> Failed(string msg = "err")
{
this.Code = (int)EnumCode.Err;
this.Successful = false;
this.Msg = msg;
return this;
} /// <summary>
/// 异常
/// </summary>
/// <param name="data"></param>
/// <param name="msg"></param>
/// <returns></returns>
public ResultDto<T> Failed(string msg, int enumCode)
{
this.Code = enumCode;
this.Successful = false;
this.Msg = msg;
return this;
} }

我们再次尝试返回该类型结果

  return ResultTo<TokenDto>.Success(tokenDto, "登录成功");

看看swagger文档的显示,正是我们需要的

根据经验我们还要需要返回列表

 /// <summary>
/// 泛型结果模型集合
/// </summary>
public interface IResultListDto<T> : IResultDto
{ /// <summary>
/// 常规数据
/// </summary>
new List<T> Data { get; set; } }
 /// <summary>
/// 泛型结果模型集合
/// </summary>
public interface IResultListDto<T> : IResultDto
{ /// <summary>
/// 常规数据
/// </summary>
new List<T> Data { get; set; } }
 /// <summary>
/// 泛型类 返回模型
/// </summary>
/// <typeparam name="T"></typeparam>
public class ResultListDto<T> : ResultDto, IResultListDto<T>
{ /// <summary>
/// 常规数据
/// </summary>
public new List<T> Data { get; set; } /// <summary>
/// 成功
/// </summary>
/// <param name="data"></param>
/// <param name="msg"></param>
/// <returns></returns>
public ResultListDto<T> Success(List<T> data = default, string msg = "success")
{
this.Code = (int)EnumCode.Succeed;
this.Successful = true;
this.Data = data;
this.Msg = msg;
return this;
} /// <summary>
/// 异常
/// </summary>
/// <param name="data"></param>
/// <param name="msg"></param>
/// <returns></returns>
public ResultListDto<T> Failed(string msg = "err")
{
this.Code = (int)EnumCode.Err;
this.Successful = false;
this.Msg = msg;
return this;
} /// <summary>
/// 异常
/// </summary>
/// <param name="data"></param>
/// <param name="msg"></param>
/// <returns></returns>
public ResultListDto<T> Failed(string msg, int enumCode)
{
this.Code = enumCode;
this.Successful = false;
this.Msg = msg;
return this;
} }
    /// <summary>
/// 泛型类 返回模型
/// </summary>
/// <typeparam name="T"></typeparam>
public class ResultListDto<T> : ResultDto, IResultListDto<T>
{ /// <summary>
/// 常规数据
/// </summary>
public new List<T> Data { get; set; } /// <summary>
/// 成功
/// </summary>
/// <param name="data"></param>
/// <param name="msg"></param>
/// <returns></returns>
public ResultListDto<T> Success(List<T> data = default, string msg = "success")
{
this.Code = (int)EnumCode.Succeed;
this.Successful = true;
this.Data = data;
this.Msg = msg;
return this;
} /// <summary>
/// 异常
/// </summary>
/// <param name="data"></param>
/// <param name="msg"></param>
/// <returns></returns>
public ResultListDto<T> Failed(string msg = "err")
{
this.Code = (int)EnumCode.Err;
this.Successful = false;
this.Msg = msg;
return this;
} /// <summary>
/// 异常
/// </summary>
/// <param name="data"></param>
/// <param name="msg"></param>
/// <returns></returns>
public ResultListDto<T> Failed(string msg, int enumCode)
{
this.Code = enumCode;
this.Successful = false;
this.Msg = msg;
return this;
} }

顺着这个思路,我们可以继续实现分页,多参数返回等等,如果你觉得麻烦,当然也可以直接在nuget直接引用 Sy.ResultExtension,这个组件,苦逼的码农小哥已经为你实现了该功能。

插件化编程之WebAPI统一返回模型的更多相关文章

  1. 深入理解Android插件化技术

    深入理解Android插件化技术  转 https://zhuanlan.zhihu.com/p/33017826 插件化技术可以说是Android高级工程师所必须具备的技能之一,从2012年插件化概 ...

  2. Android插件化技术——原理篇

    <Android插件化技术——原理篇>     转载:https://mp.weixin.qq.com/s/Uwr6Rimc7Gpnq4wMFZSAag?utm_source=androi ...

  3. ASP.NET Core 2.2 WebApi 系列【八】统一返回格式(返回值、模型验证、异常)

    现阶段,基本上都是前后端分离项目,这样一来,就需要前后端配合,没有统一返回格式,那么对接起来会很麻烦,浪费时间.我们需要把所有接口及异常错误信息都返回一定的Json格式,有利于前端处理,从而提高了工作 ...

  4. webapi接口统一返回请求时间

    webapi接口统一返回请求时间: public class BaseController : ControllerBase { protected ReturnResult<T> Res ...

  5. 基于 abp vNext 和 .NET Core 开发博客项目 - 统一规范API,包装返回模型

    上一篇文章(https://www.cnblogs.com/meowv/p/12916613.html)使用自定义仓储完成了简单的增删改查案例,有心的同学可以看出,我们的返回参数一塌糊涂,显得很不友好 ...

  6. Python Flask高级编程之RESTFul API前后端分离精讲 (网盘免费分享)

    Python Flask高级编程之RESTFul API前后端分离精讲 (免费分享)  点击链接或搜索QQ号直接加群获取其它资料: 链接:https://pan.baidu.com/s/12eKrJK ...

  7. 【Java】网络编程之NIO

    简单记录 慕课网-解锁网络编程之NIO的前世今生 & 一站式学习Java网络编程 全面理解BIO/NIO/AIO 内容概览 文章目录 1.[了解] NIO网络编程模型 1.1.NIO简介 1. ...

  8. 异步编程之Generator(2)——剖析特性

    异步编程系列教程: (翻译)异步编程之Promise(1)--初见魅力 异步编程之Promise(2):探究原理 异步编程之Promise(3):拓展进阶 异步编程之Generator(1)--领略魅 ...

  9. Android 全面插件化 RePlugin 流程与源码解析

    转自 Android 全面插件化 RePlugin 流程与源码解析 RePlugin,360开源的全面插件化框架,按照官网说的,其目的是“尽可能多的让模块变成插件”,并在很稳定的前提下,尽可能像开发普 ...

随机推荐

  1. 【AcWing】第 62 场周赛 【2022.07.30】

    AcWing 4500. 三个元素 题目描述 给定一个长度为 \(n\) 的数组 \(r\_1,r\_2,-,r\_n\). 请你找到其中的三个元素 \(r\_a,r\_b,r\_c\),使得 \(r ...

  2. linux rz上传失败

    最近rz上传文件时出现了一次文件上传失败的情况,故搜集了以下资料加强学习 rz -ary --o-sync -a 表示使用ascii码格式传输文件,如果是Dos格式的文件,会转换为unix格式 -r ...

  3. Apache DolphinScheduler&ShenYu(Incubating) 联合 Meetup,暖春 3 月与你相约!

    云霞出海曙,梅柳渡江春. 2022 年的早春在疫情中显得格外生机勃勃,虽然接下来寒流仍有可能造访国内部分地区,但开源的世界,早已热闹非凡! 2022 年 3 月 26 日(星期六), Apache D ...

  4. java学习第五天异常机制.day14

    异常处理机制 确保程序的正常执行.这种机制称为异常处理机制 异常对象 常用方法 方法介绍 toString 返回异常类型和异常信息 getMessage 返回异常信息 printStackTrace ...

  5. a 标签 rel 属性值 opener 的作用

    <a> 元素,原英文单词为 anchor 的缩写,所以又称之为锚点元素.锚点元素的 href 属性用来创建通向其他网页.文件.同一页面内的位置.电子邮件地址或任何其他 URL 的超链接. ...

  6. Spring 08: AOP面向切面编程 + 手写AOP框架

    核心解读 AOP:Aspect Oriented Programming,面向切面编程 核心1:将公共的,通用的,重复的代码单独开发,在需要时反织回去 核心2:面向接口编程,即设置接口类型的变量,传入 ...

  7. Mac设置外网访问本地项目

    > 官网地址:https://ngrok.com/download 步骤(官网基本已经说明了步骤,但还不完善,以下为亲测步骤): 下载并注册账号 打开终端,进入ngrok.zip所在文件夹(方法 ...

  8. Python自学教程7:字典类型有什么用

    字典是Python中的一个重要操作,如果字典玩得顺,很多其他的数据类型就可以一通百通. Python字典的定义 字典使用一对大括号进行定义,键值对之间使用逗号隔开,键和值使用冒号分隔. 键必须是不可变 ...

  9. Linux的NFS的配置

    快速代码 # nfs的Server配置文件和配置方法 echo '/newnfs 192.168.3.*rw,sync,no_root_squash)' >> /etc/exports # ...

  10. JMeter测试dubbo接口总结

    Jmeter 测试dubbo 接口 1. 安装JMeter 安装到/usr/local下 2. github上下载 jmeter-plugins-dubbo-x.x.x-jar-with-depend ...