Swagger UI in AspNetCore WebAPI
Swagger其实包含了三个部分,分别是Swagger Editor文档接口编辑器,根据接口文档生成code的Swagger Codegen,以及生成在线文档的Swagger UI。
在AspNetCore中通常使用Microsoft封装的Swashbuckle来使用Swagger UI,这是一个AspNetCore的中间件。和其他中间件一样都是分为register和use两个部分。Swagger UI主要通过将特殊特性标注过的API信息生成一个OpenAPI的文档,再将文档上的信息已网页的形式显示给用户。
Installation
VS中很简单,直接用NuGet安装Swashbuckle.AspNetCore即可。

或者使用命令行: dotnet add package --version xxx Swashbuckle.AspNetCore
Register
所有Swagger UI注册的configue相关的内容都放在AddSwaggerGen这个方法里面:
namespace Microsoft.Extensions.DependencyInjection
{
public static class SwaggerGenServiceCollectionExtensions
{
public static IServiceCollection AddSwaggerGen(this IServiceCollection services, Action<SwaggerGenOptions> setupAction = null);
public static void ConfigureSwaggerGen(this IServiceCollection services, Action<SwaggerGenOptions> setupAction);
}
}
AddSwaggerGen这个方法主要用户注册中间件的时候添加一些参数,其中重要的有:
SwaggerDoc
添加一个swagger document,主要用户存储生成出来的OpenAPI文档。以及一些文档基本信息,如:作者、描述、license等。
XXXFilter
自定义filter,XXX为Swagger中的对象,当XXX创建完成后,filter可以定义操作对XXX进行处理。
AddSecurityDefinition和AddSecurityRequirement
用于给Swagger添加验证的部分。
IncludeXmlComments
为OpenAPI提供注释内容的xml,需要在IDE里面配置生成对应的XML文件。(当vs中使用生成xml文档文件这个功能的时候,如果有方法没有添加注释,vs会有提示,如果要避免这个提示,可以在下图中的Suppress warnings中把1591禁掉。)

MapType
很多时候,json的类型会有自定义的转化,这个时候需要使用MapType来让Swagger知道这个转化。
举一个PhoneNumber的例子:
public class PhoneNumber
{
public string CountryCode { get; set; } public string AreaCode { get; set; } public string SubscriberId { get; set; }
}
[HttpGet("PhoneNumber")]
public PhoneNumber GetPhoneNumber()
{
return new PhoneNumber()
{
AreaCode = "",
CountryCode = "",
SubscriberId = ""
};
}
如果在AddSwaggerGen中使用了
c.MapType<PhoneNumber>(() => new Schema { Type = "string" });
生成的json的response中就从PhoneNumber类变成了string。
"/market/PhoneNumber": {
"get": {
"tags": [
"Market"
],
"operationId": "GetPhoneNumber",
"consumes": [],
"produces": [
"text/plain",
"application/json",
"text/json"
],
"parameters": [],
"responses": {
"": {
"description": "Success",
"schema": {
"type": "string"
}
}
}
}
}
如果去掉,是这样的。
"/market/PhoneNumber": {
"get": {
"tags": [
"Market"
],
"operationId": "GetPhoneNumber",
"consumes": [],
"produces": [
"text/plain",
"application/json",
"text/json"
],
"parameters": [],
"responses": {
"": {
"description": "Success",
"schema": {
"$ref": "#/definitions/PhoneNumber"
}
}
}
}
}
Use
RouteTemplate
UseSwagger中配置Swagger页面路由信息。默认情况下是swagger/{documentName}/swagger.json
RoutePrefix
类似SharePoint中的host name,默认为swagger,如果不需要可以设置为“”。
SwaggerEndpoint
OpenAPI文件的访问URL,这个url和RouteTemplate以及SwaggerDoc的name一定要一致,不然就会有page not found的错。从浏览器访问json文件的时候url中的document name是区分大小写的。
当请求OpenAPI文件的时候,会从SwaggerEndpoint配置的url中配合RouteTemplate一起解析document的name。
下面是RouteTemplate的配置:
app.UseSwagger(option =>
{
option.RouteTemplate = string.Format("{0}/{1}", prefix, "{documentName}/swagger.json");
});
解析document name的过程。
private bool RequestingSwaggerDocument(HttpRequest request, out string documentName)
2 {
3 documentName = null;
if (request.Method != "GET") return false; var routeValues = new RouteValueDictionary();
if (!_requestMatcher.TryMatch(request.Path, routeValues) || !routeValues.ContainsKey("documentName")) return false; documentName = routeValues["documentName"].ToString();
return true;
11 }
API decorate
ApiExploreri通过AspNetCore的MVC中的routing特性标签来识别api的。
[HttpPost]
public void CreateProduct(Product product)
...
[HttpGet]
public IEnumerable<Product> SearchProducts(string keywords)
...
具体使用方式请参考Routing to controller actions in ASP.NET Core
Reference
Swashbuckle official documentation:https://github.com/domaindrivendev/Swashbuckle.AspNetCore
AspNetCore MVC Routing:https://docs.microsoft.com/en-us/aspnet/core/mvc/controllers/routing?view=aspnetcore-3.0
Swagger UI in AspNetCore WebAPI的更多相关文章
- Flask 系列之 构建 Swagger UI 风格的 WebAPI
说明 操作系统:Windows 10 Python 版本:3.7x 虚拟环境管理器:virtualenv 代码编辑器:VS Code 实验 环境初始化 # 创建项目目录 mkdir helloworl ...
- 在Abp中集成Swagger UI功能
在Abp中集成Swagger UI功能 1.安装Swashbuckle.Core包 通过NuGet将Swashbuckle.Core包安装到WebApi项目(或Web项目)中. 2.为WebApi方法 ...
- C# ABP WebApi与Swagger UI的集成
本文是配置WebApi与Swagger UI,可以参照 http://www.cnblogs.com/farb/p/ABPSwaggerUIIntegration.html 1. 安装swagger ...
- WebApi使用swagger ui自动生成接口文档
之前就写到.最近正在使用webapi.这里介绍一个实用的东西swageer ui现在开发都是前后端分开.我们这里是给前端提供api.有时候对于一个api的描述,并不想专门写一份文档.很浪费时间.swa ...
- Asp.net WebApi 配置 Swagger UI
首先安装Swashbuckle.Core 然后添加swagger配置文件. [assembly: PreApplicationStartMethod(typeof(SwaggerConfig), &q ...
- 【转】C# ABP WebApi与Swagger UI的集成
以前在做WebAPI调用测试时,一直在使用Fiddler测试工具了,而且这个用起来比较繁琐,需要各种配置,并且不直观,还有一点是还得弄明白URL地址和要传递的参数,然后才能调用. 最近新入职,公司里 ...
- webapi+swagger ui 文档描述
代码:GitHub swagger ui在我们的.NET CORE和.NET Framework中的展现形式是不一样的,如果有了解的,在.NET CORE中的是比.NET Framework好的.两张 ...
- .Net WebApi接口之Swagger UI 隐藏指定接口类或方法
swagger的一个最大的优点是能实时同步api与文档,但有些时候我们不想全部公开接口,而要隐藏或屏蔽一些接口类或方法,swagger也是支持的,只需要设置一下DocumentFilter方法. 第一 ...
- 除了Swagger UI,你还能选择 IGeekFan.AspNetCore.RapiDoc
IGeekFan.AspNetCore.RapiDoc 看到博客园上的这个文章,说了下Knife4J,评论里有人推荐RapiDoc,放了几个图,看了下,还不错. 心里 便有个想法,借着上次研究 Kni ...
随机推荐
- Springboot整合Mybatis实现级联一对多CRUD操作
在关系型数据库中,随处可见表之间的连接,对级联的表进行增删改查也是程序员必备的基础技能.关于Spring Boot整合Mybatis在之前已经详细写过,不熟悉的可以回顾Spring Boot整合Myb ...
- Windows下使用virtualenv创建虚拟环境
操作系统 : windowns10_x64Python版本:3.6.8virtualenv版本:16.7.7virtualenvwrapper版本:1.2.5 方式一:直接使用virtualenv 1 ...
- 在windows桌面上创建一个文件夹
用dos命令创建 md [文件路径][文件名] C:\Users\admin>md C:\Users\admin\desktop\test 刷新一下桌面,就可以看见桌面上创建了一个名为test ...
- javascript ES6 新特性之 class
在之前的文章中我们讲过原型,原型链和原型链继承的文章,在 ES6 中为我们提供了更为方便的 class,我们先来看一下下面的例子: function Person(name) { //构造函数里面的方 ...
- 隐藏Nginx软件版本号信息
为了提高我们web服务器的安全性,我们应当尽可能的隐藏服务器的信息以防止他人通过这些信息找到漏洞侵入我们的服务器,对于Nginx而言,我们安装好Nginx后最好隐藏Nginx的版本号,以防止通过该版本 ...
- Kafka简明教程
作者:柳树之 www.jianshu.com/p/7b77723d4f96 Kafka是啥?用Kafka官方的话来说就是: Kafka is used for building real-time d ...
- PHP安全之道学习笔记4:系统命令注入
系统命令注入 我们有时候写代码会用php脚本去调用系统函数完成业务功能,但是一些系统函数属于高危操作,一旦被webshell或者抓住漏洞则后患极大. 下面整理如下风险系统函数. exec() 函数 该 ...
- 前端知识体系-NodeJS相关】NodeJS基础知识全面总结
NodeJS基础知识 1. Node的全局对象和全局变量 1.1 全局对象:所有模块都可以调用的 global:表示Node所在的全局环境,类似于浏览器的window对象. process:该对象表示 ...
- error: (-215:Assertion failed) !_src.empty() in function 'cv::cvtColor'
这个报错一般是因为你图像的路径写错了,找不到图像而导致的. 解决问题的朋友麻烦点个推荐呗!嘿嘿
- 解决vue修改路由的查询字符串(query)url不改变,页面不刷新问题
我个人猜测可能是对路由的数据检测深度不够吧,单纯修改query里面的属性是不能触发数据驱动的,因此要直接给query赋值新的对象才能驱动数据更新,做法如下 第一种 var query=JSON.par ...