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. 获取字典中values值中最大的数,返回对应的keys

    1.字典中键值对的获取 print(data.values()) # 查看字典的值 print(data.keys()) # 查看字典的key 2.对字典中的值进行排序 sorted(data.val ...

  2. 多线程与高并发(三)—— 源码解析 AQS 原理

    一.前言 AQS 是一个同步框架,关于同步在操作系统(一)-- 进程同步 中对进程同步做了些概念性的介绍,我们了解到进程(线程同理,本文基于 JVM 讲解,故下文只称线程)同步的工具有很多:Mutex ...

  3. 从matlab的bwmorph函数的'majority'参数中扩展的一种二值图像边缘光滑的实时算法。

    在matlab的图像处理工具箱中,有一系列关于Binary Images的处理函数,都是以字母bw开头的,其中以bwmorph函数选项最为丰富,一共有'bothat'.'branchpoints'.' ...

  4. #万答10:mysqldump 是如何实现一致性备份的

    万答10:mysqldump 是如何实现一致性备份的 实验场景 MySQL 8.0.25 InnoDB 实验步骤: 先开启 general_log 观察导出执行过程的变化 set global gen ...

  5. nginx代理与反向代理原理

    简介: nginx是一个http服务器,稳定性好,底层由c编写,一个高性能的http 服务器/反向代理服务器及电子邮件代理服务器. nginx可以做web服务器,也可以做网关,主要应用于代理和方向代理 ...

  6. Redis 10 位图

    参考源 https://www.bilibili.com/video/BV1S54y1R7SB?spm_id_from=333.999.0.0 版本 本文章基于 Redis 6.2.6 概述 Redi ...

  7. Spring源码 10 IOC refresh方法5

    本文章基于 Spring 5.3.15 Spring IOC 的核心是 AbstractApplicationContext 的 refresh 方法. 其中一共有 13 个主要方法,这里分析第 5 ...

  8. 用HTTP服务的方式集成learned cardinality estimate方法进 Postgresql

    代码地址:postgresql-13.1-ml: Integration of CardEst Methods into PostgreSQL by HTTP Server (github.com) ...

  9. Java SE 12 新增特性

    Java SE 12 新增特性 作者:Grey 原文地址:Java SE 12 新增特性 源码 源仓库: Github:java_new_features 镜像仓库: GitCode:java_new ...

  10. Excel 文本函数(一):LEFT、RIGHT 和 MID

    文本函数 LEFT.RIGHT 以及 MID 是非常常用的,它们用于截取文本字符串. LEFT(text, [num_chars]) 是从文本字符串的左边开始截取:RIGHT(text, [num_c ...