基于.NetCore3.1搭建项目系列 —— 使用Swagger做Api文档 (下篇)

前言

  回顾上一篇文章《使用Swagger做Api文档 》,文中介绍了在.net core 3.1中,利用Swagger轻量级框架,如何引入程序包,配置服务,注册中间件,一步一步的实现,最终实现生产自动生产API接口说明文档。文中结尾也留下了一个让大家思考的问题。在这里,我们重新回顾一下这几个问题

  1. 已经有接口了,但如何添加注释呢?

  2. 作为接口使用者,我们关心的是接口的返回内容和响应类型,那我们如何定义描述响应类型呢?

  3. 在项目开发中,使用的实体类,又如何在Swagger中展示呢?

  4. 在部署项目,引用Swagger既有文档又不需要额外部署,但是如何在开发环境中使用,而在生产环境中禁用呢?

开始

 一、为接口方法添加注释

1 . 按照下图所示 连点三次 / 即可添加文档注释

  如下所示

2.启用XML 注释

   右键web 项目名称=>属性=>生成,勾选“输出”下面的“xml文档文件”,系统会默认生成一个,如下图所示

 3.配置服务

  在之前注册的Swagger服务代码中,添加以下几行代码,引入xml文件

整体的代码如下:

 4.重新编译运行

  查看效果

注意:如果需要对控制器进行注释说明如下,可以将

  c.IncludeXmlComments(xmlPath,true); 这个设置为true,显示效果如下:

二、描述响应类型

  接口使用者最关心的就是接口的返回内容和相应类型啦。下面展示一下201和400一个简单例子:

  我们需要在我们的方法上添加:[ProducesResponseType(201)][ProducesResponseType(400)]

  然后添加相应的状态说明:<response code="201">返回value字符串</response><responsecode="400">如果id为空</response>

  最终代码应该是这个样子:

效果如下:

三、实体类展示添加注释

 新建一个Movie的实体类,MovieModel

在控制器中引入接口方法

效果如下:

四、在生产环境中禁用

  可以将Swagger的UI页面配置在Configure的开发环境之中

放到if(env.IsDevelopment())即可。

五、隐藏某些接口

 如果不想显示某些接口,直接在controller 上,或者action 上,增加特性

        [ApiExplorerSettings(IgnoreApi = true)]

六、忽视Swagger注释警告

 启用XML 注释后会为未记录的公共类型和成员提供调试信息。如果出现很多警告信息  例如,以下消息指示违反警告代码 1591:

 原来是swagger把一些action 方法都通过xml文件配置了,如果你不想每一个方法都这么加注释,可以这么配置,在当前项目进行配置,可以忽略警告,记得在后边加上分号 ;1591

常见错误

 Swagger使用的时候报错,无法看到列表,这里说下如何调试和主要问题:

1.找不到文件

请在浏览器 =F12 ==console 控制台 ==》点击错误信息地址

发现是404,说明是找不到指定的文件,可以存在以下情况:

这是因为接口json文档定义和调用不是一个

1、定义:

ConfigureServices方法中的  services.AddSwaggerGen 注册的一个名字 c.SwaggerDoc("v1", 

2、调用:

Configure 方法中的 app.UseSwaggerUI(c =>   调用  c.SwaggerEndpoint("/swagger/V1/swagger.json;

看看两者是否一致

 2. 500错误无法解析

直接链接http://localhost:xxxxx/swagger/v1/swagger.json,就能看到错误了

这种可以存在以下情况:

1 . 接口请求的方式不明确:少了[httpget]、[httpPost]等,导致无法解析

总结

   1. 通过这一篇的整体学习,我们已经解决了上一篇文章留下的问题,也知道了怎样更好的使用Swagger进行开发接口文档,更加方便快捷的使用

   2. 从上篇的引用配置启动,到这一篇的升级改造,让接口文档更加通俗易懂。

   3. 关注公众号可以获取资料

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/308939.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++ vector容器中常见的三种遍历方式

1.迭代器 for (std::vector<int>::iterator it vecTest.begin(); it ! vecTest.end(); it){tempNum *it;}2.C11 新增关键字auto for (auto it : vecTest){tempNum it;}3.对C念念不舍的童鞋们习惯的数组写法 for (size_t i 0; i < maxCount; i){tempNum vecTest[i…

二叉树的中序遍历非递归方法(算法导论第三版12.1-3)

二叉树的中序遍历非递归方法&#xff08;算法导论第三版12.1-3&#xff09; 1⃣️用栈实现 template<typename T> void inorder_tree_walk_non_recursion_by_stack(BinaryTreeNode<T> *node) {Stack<BinaryTreeNode<T>*> stack;stack.push(node);whi…

C++ vector容器中用erase函数和迭代器删除重复元素问题分析

第一种写法&#xff1a; #include <iostream> #include <vector> using namespace std;int main() {vector<int>v;v.push_back(888);v.push_back(89);v.push_back(89);v.push_back(89);v.push_back(9999);v.push_back(89);for (std::vector<int>::ite…

基于.NetCore3.1搭建项目系列 —— 使用Swagger做Api文档(上篇)

前言为什么在开发中&#xff0c;接口文档越来越成为前后端开发人员沟通的枢纽呢&#xff1f;随着业务的发张&#xff0c;项目越来越多&#xff0c;而对于支撑整个项目架构体系而言&#xff0c;我们对系统业务的水平拆分&#xff0c;垂直分层&#xff0c;让业务系统更加清晰&…

写出TREE-MINIMUM 和TREE-MAXIMUM的递归版本(算法导论第三版12.2-2)

写出TREE-MINIMUM 和TREE-MAXIMUM的递归版本&#xff08;算法导论第三版12.2-2&#xff09; template<typename T> BinaryTreeNode<T>* tree_minimum_recursion(BinaryTreeNode<T>* node) {if(node nullptr) return node;if(node->left ! nullptr)retur…

数据结构-树:根节点、子节点、叶子节点是什么?

前言&#xff1a;这个属于数据结构&#xff1a;树。 下面给个例子图解释&#xff08;根节点、子节点、叶子节点&#xff09;。 上图数字 1、3、7是叶子节点&#xff1b;&#xff08;因为他们下面没有分叉出子节点&#xff0c;所以称为&#xff1a;叶子节点&#xff09;【度为0】…

使用kibana可视化报表实时监控你的应用程序

先结果导向&#xff0c;来看我在kibana dashborad中制作的几张监控图。一&#xff1a;先睹为快1. dashboard1监控几个维度的日志&#xff0c;这么点日志量是因为把无用的清理掉了&#xff0c;而且只接入了部分应用。每日日志总数。每日日志错误数&#xff0c;从log4net中levelE…

写出TREE-PREDECESSOR的伪代码(算法导论第三版12.2-3)

写出TREE-PREDECESSOR的伪代码&#xff08;算法导论第三版12.2-3&#xff09; TREE-PREDECESSOR(x)if x.left ! NILreturn TREE-MAXIMUM(x.left)y x.pwhile y ! NIL and x y.leftx yy y.preturn y下面是c代码 template<typename T> BinaryTreeNode<T>* tree_…

[EDA]Quartus II 实验简答题

1&#xff0e;使用 Quartus 编辑波形文件时&#xff0c;界面如下图所示&#xff0c;图中用方框标注的区域&#xff0c;名称是什么&#xff1f;在图中&#xff0c;A、B是输入端口&#xff0c;S是输出端口&#xff0c;要编辑的是哪些信号&#xff1f;为什么。 1&#xff0e;方框标…

基于.NetCore3.1搭建项目系列 —— 使用Swagger导出文档 (补充篇)

前言在上一篇导出文档番外篇中&#xff0c;我们已经熟悉了怎样根据json数据导出word的文档&#xff0c;生成接口文档&#xff0c;而在这一篇&#xff0c;将对上一篇进行完善补充&#xff0c;增加多种导出方式&#xff0c;实现更加完善的导出功能。回顾1. 获取Swagger接口文档的…

[EDA]FPGA/CPLD 设计流程步骤及步骤概念

EDA&#xff08;以 FPGA/CPLD 设计为例&#xff09;流程步骤 1.设计输入 2.全程编译 3.仿真验证 4.编程下载 5.硬件测试 设计输入 原理图/HDL文本编辑或其他输入方式把电路系统输入到EDA平台中。 综合编译 EDA综合器把设计输入描述的电路系统从高层级转换为低层级的电路网表&am…

[EDA] 给出一个双进程状态机,请把它改为单进程状态机。

给出一个双进程状态机&#xff0c;请把它改为单进程状态机。 解答&#xff1a;

给出TREE_INSERT过程的非递归版本(算法导论第三版12.3-1)

给出TREE_INSERT过程的非递归版本&#xff08;算法导论第三版12.3-1&#xff09; template<typename T> void insert_recursive(BinaryTree<T>& tree,BinaryTreeNode<T>* root, BinaryTreeNode<T>* node) {if(tree.root nullptr){tree.root nod…

[EDA] 给出一个状态机,请把它的组合进程分为2个,分别命名为COM1和COM2,其中:COM1实现对外的控制信号输出,COM2实现状态译码。

给出一个状态机&#xff0c;请把它的组合进程分为2个&#xff0c;分别命名为COM1和COM2&#xff0c;其中&#xff1a;COM1实现对外的控制信号输出&#xff0c;COM2实现状态译码。 解答&#xff1a;

基于.NetCore3.1搭建项目系列 —— 使用Swagger导出文档 (番外篇)

前言回顾之前的两篇Swagger做Api接口文档&#xff0c;我们大体上学会了如何在net core3.1的项目基础上&#xff0c;搭建一套自动生产API接口说明文档的框架。本来在Swagger的基础上&#xff0c;前后端开发人员在开发生产期间&#xff0c;可以借此进行更加便捷的沟通交流。可是总…

[EDA] 第1章 EDA技术概述-潘松版

第1章 EDA技术概述 知识点&#xff1a; 1.1 EDA技术及其发展 名称概念&#xff1a; EDA&#xff1a;Electronic Design Automation&#xff0c;即电子设计自动化&#xff0c;是指是以计算机为平台&#xff0c;使用通用软件包&#xff0c;开展电子电路设计、电子电路仿真、PCB设…

lua实现stack(lua程序设计21.7 练习21.1题)

lua实现stack&#xff08;lua程序设计21.7 练习21.1题&#xff09; Stack {} function Stack:new(o)o o or {}self.__index selfsetmetatable(o,self)return o end function Stack:push(v)table.insert(self,v) end function Stack:pop()local v self[#self]table.remove(…

遵守这些原则让你开发效率提高一倍

一、概述在园子里面有很多关于各种技术细节的研究文章&#xff0c;都是比较牛逼的框架研究&#xff1b;但是一直没有看到关于怎么样提高开发效率的文章&#xff0c;大多提高开发效率的文章都是关于自动化等方面的辅助工具类型的&#xff0c;而不是开发中的一些小技巧&#xff1…

[EDA] 2.2 简单PLD结构原理-潘松版

2.2 简单PLD结构原理 知识点&#xff1a; 2.1 PLD概述 名称概念&#xff1a; PLD&#xff1a;Programmable Logic Device&#xff0c;可编程器件 PLD的分类&#xff1a;1、按集成度分&#xff0c;可分为简单PLD和复杂PLD&#xff1b;2、按器件结构分类&#xff0c;可分为 “乘…

lua实现继承(lua程序设计21.7 练习21.2题)

lua实现继承&#xff08;lua程序设计21.7 练习21.2题&#xff09; StackQueue Stack:new() function StackQueue:insertBottom(v)table.insert(self,1,v) endlocal stack2 StackQueue:new() for i 1, 10 dostack2:push(i) end stack2:insertBottom(11)while not stack2:ise…