前言

由于最近一直在修改一下排版,同时找了非技术的朋友帮忙看一下排版的问题,现在已经基本上确定了排版和样式了。更新可以恢复正常了。

作为一个写前端代码基本只写js不写css的开发,搞排版真的头疼。。各位将就着看吧!!排版并不会太高大上,主要是保证了阅读体验,让各位尽量不会看得头晕眼花而错过了比较重要的内容。希望各位有收获吧!然后后面我会找个时间把之前的文章再重新排版一下。。

简要说明

【项目源码】

【章节目录】

本文主要是介绍如何接入swagger来自动生成api文档。【Swagger介绍】

首先我们需要知道的是swagger是可以通过xml的格式来进行生成相关的接口文档的,其次VS是可以根据代码的注释进行生成相应的xml的。因此我们可以借助VS的xml文件使swagger生成相关的文档。

再然后一点就是我们要确定我们需要生成文档的项目。根据之前的介绍我们知道我们可以对外输出的项目一个是api是用于接口的;另一个就是application.contract,这个项目主要定义了入参与出参的dto是可以对外输出的。所以我们需要生成swagger的项目就只有这两个。具体步骤如下:

具体步骤

1、选中AbpVnext.Learn.HttpApi项目-》右键-》属性-》生成;然后如下配置输出xml文档

2、然后生成项目,若此项目中存在标准的注释,则会生成相应的xml文件,如下所示:



3、然后右键此xml文件-》属性-》始终复制;Application.Contracts项目重复以上的操作

4、在LearnHttpApiHostModule找到原来的AddSwaggerGen方法,修改为以下的形式,然后调试项目:

context.Services.AddSwaggerGen(
options =>
{
options.SwaggerDoc("v1", new OpenApiInfo { Title = "Learn API", Version = "v1" });
options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
{
Description = "JWT授权(数据将在请求头中进行传输) 直接在下框中输入Bearer {token}(注意两者之间是一个空格)\"",
Name = "Authorization",//jwt默认的参数名称
In = ParameterLocation.Header,//jwt默认存放Authorization信息的位置(请求头中)
Type = SecuritySchemeType.ApiKey
});
options.AddSecurityRequirement(new OpenApiSecurityRequirement
{
{ new OpenApiSecurityScheme
{
Reference = new OpenApiReference()
{
Id = "Bearer",
Type = ReferenceType.SecurityScheme
}
}, Array.Empty<string>() }
});
var xmlapipath = Path.Combine(AppContext.BaseDirectory, "AbpVnext.Learn.HttpApi.xml");
if (File.Exists(xmlapipath))
{
options.IncludeXmlComments(xmlapipath);
}
var xmlapppath = Path.Combine(AppContext.BaseDirectory, "AbpVnext.Learn.Application.Contracts.xml");
if (File.Exists(xmlapipath))
{
options.IncludeXmlComments(xmlapppath);
}
});

现在我们可以看到相应的api与入参,出参的dto都已经生成成功了,但是还有一点不太满意的是LoginOutputDto没有输出来。由于我们的ResultModel的data是一个object,所以对swagger来说,相当于没有使用的LoginOutputDto则不输出此Dto的文档。因此我们需要进一步优化,使用泛型来规划输出的参数,而不使用object这类弱类型

5、修改ResultModel为ResultModel,如下:

 public class ResultModel<T>
{
public ResultModel(int _code,string _msg,T _data)
{
code = _code;
msg = _msg;
data = _data;
}
/// <summary>
/// 0为成功,其它为失败
/// </summary>
public int code { get; set; }
public string msg { get; set; }
public T data { get; set; }
}

修改登录的接口的代码,如下图,

再次调试项目,如下图所示,我们的出参dto也生成出来了,而且由于我们在接口里面很清晰的描

述了入参是哪个dto,出参是哪个dto,在与前端或客户端同事联调的时候并不需要输出太多内容,

只要说是哪个接口就行了,然后他就可以去找相应的接口与dto了。

6、然后,我们可以看到,token的Auth的按钮也显示在了页面上

接下来我们试一下这个功能是否完善了。首先我们在Base的LearnController中添加以下代码,用于获取用户的登录id

/// <summary>
/// 登录用户的用户id
/// </summary>
protected string userid
{
get { return HttpContext.User.Identity.IsAuthenticated ? HttpContext.User.FindFirst(ClaimTypes.NameIdentifier).Value : ""; }
}

然后我们在UserController中添加以下代码来获取User信息:

[HttpPost]
[Route("init")]
[Authorize]
public async Task<ResultModel<UserDto>> Init()
{
var user =await _userAppServices.get_userbyuserid(new Guid(userid));
return new ResultModel<UserDto>(200, "", user);
}

然后调试项目,点击Authorize---》输入Login接口获取到的token--》Authorize,如下图

测试user/init接口,如下图,表示我们的token的授权与解析相应的用户id是正常的

最后有一点要注意的是,由于xml文件大家都是使用的同一样的,因此建议是不能签入的,应该是加入ignorelist里面,由jenkins/gitlab等自动打包的工具进行生成统一的xml,开发人员只要进行代码相关的签入就行了。

下一章介绍

Auttomapper与validation的使用方法,这里使用的是官方的validation来进行校验。虽然FluentValidation更加强大,但是个人觉得validation已经能满足绝大部分需求了,如果有进一步的判断,可以直接写有controller里面,没必要为了很小一部分的需求而引入一个更复杂的组件。这个各位可以根据自己的需求进行判断

[Abp vNext 入坑分享] - 6.完整接入swagger的更多相关文章

  1. [Abp vNext 入坑分享] - 前言

    一·背景 Abp vnext是 ABP 框架作者所发起一个完全基于 ASP .NET Core框架,截至2020年4月份已经升级到2.5.0版本,根据经验2.0版本以后可以放心的使用在生产环境.类似a ...

  2. [Abp vNext 入坑分享] - 8.Redis与Refit的接入

    前言 本章结束之后,这个abp vnext系列算是初步完结了,基础的组件都已经接入了.如果各位还需要其它的组件的话,可以自己按需要进行接入使用.其实这个只是一个基础的框架,可以自己根据需要进行变通的. ...

  3. [Abp vNext 入坑分享] - 7.Automapper与validation的使用

    简要说明 [项目源码] [章节目录] 本文主要介绍Automapper与Validation的使用方法.首先使用Automapper的目的是引入组件完成entity与dto之间的转换以达到简化代码的目 ...

  4. [Abp vNext 入坑分享] - 5.全局异常替换

    一.简要说明 [项目源码] [章节目录]   前面我们已经初步完成了框架的功能了,jwt的也已经接入完成了.   现在需要进行全局异常的接入了,abpvnext官方本来就有了全局异常的模块了,介绍链接 ...

  5. [Abp vNext 入坑分享] - 4.JWT授权的接入

    一.感想 在写这一系列文章之前,本来以为写这个之前已经搭建好的框架描述会比较简单,但是慢慢写下来才发现.写这个真的不简单额,本来以为图文一起,一个晚上应该能输出一篇吧...结果:现实真的骨感,一个星期 ...

  6. [Abp vNext 入坑分享] - 1.创建初始的项目

    一.简要说明 本篇文章主要是跟着官方的文档把项目安装好先,同时了解一下大概的项目结构. 二.具体步骤 2.1全局安装ABP CLI,直接在cmd中安装即可.如果你之前安装过,这里可以略过: dotne ...

  7. [Abp vNext 入坑分享] - 3.简单的用户模块功能开发

    一.简要说明 本篇文章开始进行业务模块的开发模拟,借助user模块来进行业务开发,主要是用户相关的基础操作.主要是先使用Users来体验整个开发的流程.主要是先把一个基础流程跑顺利,在这里我并不会过于 ...

  8. [Abp vNext 入坑分享] - 2.简化项目结构

    一.简要说明 本篇文章根据我自己的需要对项目结果进行简化,让项目结构更符合我自己的要求,同时让项目跑起来.仅供参考 二.具体步骤 2.1卸载掉对我来说目前使用不上的项目,identityserver, ...

  9. Abp vnext EFCore 实现动态上下文DbSet踩坑记

    背景 我们在用EFCore框架操作数据库的时候,我们会遇到在 xxDbContext 中要写大量的上下文 DbSet<>; 那我们表少还可以接受,表多的时候每张表都要写一个DbSet, 大 ...

随机推荐

  1. 深入理解kestrel的应用

    1 前言 之所以写本文章,是因为在我停止维护多年前写的NetworkSocket组件两年多来,还是有一些开发者在关注这个项目,我希望有类似需求的开发者明白为什么要停止更新,可以使用什么更好的方式来替换 ...

  2. 原生Js贪吃蛇游戏实战开发笔记

    前言 本课程是通过JavaScript结合WebAPI DOM实现的一版网页游戏---贪吃蛇的开发全过程,采用面向以象的思想设计开发.通过这个小游戏的开发, 不仅可以掌握JS的语法的应用,还可以学会D ...

  3. STM32 内存分配解析及变量的存储位置

    内存映射 在一些桌面程序中,整个内存映射是通过虚拟内存来进行管理的,使用一种称为内存管理单元(MMU)的硬件结构来将程序的内存映射到物理RAM.在对于 RAM 紧缺的嵌入式系统中,是缺少 MMU 内存 ...

  4. 学习笔记-CTF密码相关

    RSA共模攻击 RSA基本原理 ①  选择两个大的质数p和q,N=pq: ②  根据欧拉函数,求得r=(p-1)(q-1): ③  选一个小于r的整数e,求得e关于模r的模反元素d: ④  将p和q的 ...

  5. 小白也能轻松上手的Prometheus教程

    这篇文章将承接此前关于使用Prometheus配置自定义告警规则的文章.在本文中,我们将demo安装Prometheus的过程以及配置Alertmanager,使其能够在触发告警时能发送邮件,但我们将 ...

  6. zoj_2511 Design T-Shirt 贪心

    Design T-Shirt Time Limit: 2 Seconds      Memory Limit: 32768 KB Soon after he decided to design a T ...

  7. sed 和 awk

    sed [选项] 动作 文件 -n #取消默认输出 ,有n必须要有p,有p加了n才不会有默认输出 -i #真正的替换,修改 -r #支持扩展正则 (* [A-z] '|') 内部命令: p #打印 - ...

  8. eggjs解决跨域问题

    Egg.js 是什么? Egg.js 为企业级框架和应用而生,我们希望由 Egg.js 孕育出更多上层框架,帮助开发团队和开发人员降低开发和维护成本. Egg.js特性 提供基于 Egg 定制上层框架 ...

  9. SQL SERVER 性能优化二: 数据库初始值大小及增长方式设置

    数据库增长方式主要有两种,按百分比自动增长和按固定大小自动增长,设置初始大小和增长方式需谨慎. 初始大小就是建库的大小,设小了,容易造成磁盘碎片,频繁增长也会影响IO响应.设大了,也不行,设大了,每次 ...

  10. 关于 cmd 命令运行时发现错误(已加 classpath): 找不到或无法加载主类 xxx.class 原因: Java .lang.ClassNotFoundException: xxx.class

    我的是这个代码,出现了,无法加载主类的问题,查看了一些回答,有的是说要删除包名(我的没有带包,所以不是这个问题),还有的是说classpath的配置有问题,但是我的java ,javac测试jdk的时 ...