Oh my God, Swagger API文档竟然可以这样写?

摘要:
为了避免在联合调试期间来回撕裂,今天我们将讨论Swaager姿势的正确使用。基本Swagger用法在ConfigureServices中配置Swagger文档,并在Configure//Install PackageSwashbuck中启用中间件。AspNetCore策略服务。AddSwaggerGen——应用程序。UseSwagger();应用程序。使用SwaggerUI;应用程序将在/Swagger页面上加载最基本的API文档=null;}如图所示,生成SwaggerUI:Post请求的Payload字段的值相对复杂,并且该值没有传递到前端作为示例?下面是如何治愈这些顽疾,并编写一个自我描述和优雅的API文档。Swagger的最佳实践是将三除以五,并给出一个示例://////添加一个热图////////示例请求:///`//POST/hotmap///{///“displayName”:“demo-name 1”,//“matchRule”:0,///“matchCondition”:“https://www.cnblogs.com/JulianHuang/“,///”targetUrl“:”https://www.cnblogs.com/JulianHuang/“,///”版本“:[///{///”versionName“:”ver2020“,//”startDate“:”2020-12-13T10:03:09“,//“endDate”:”2020-10-123T10:03:00 9“,”,///“createDate”:“2020-12-11T10:03:0 9”///}//]///}///` `////``////////˂/returns][Consumers][ProductesResponseType][HttpPost]publicasyncTask<bool>AddHotmapAsync{varmodel=ObjectMapper.Map<CreateHotmapInput,Hotmap>;model.ProfileId=CurrentUser.TenantId;await_hotmaps.InsertAsync;return“done!Consumers and Products是指示请求/响应支持的内容类型的筛选器,位于Microsoft.AspNetCore.Mvc命名空间中。

最好的总会在不经意间出现。

作为后端程序员,免不了与前端同事对接API, 一个书写良好的API设计文档可有效提高与前端对接的效率。

为避免联调时来回撕逼,今天我们聊一聊正确使用Swaager的姿势。

基础Swagger用法

ConfigureServices配置Swagger文档,在Configure启用中间件

 // Install-Package Swashbuckle.AspNetCore 略 
 services.AddSwaggerGen(
       options =>
       {
           options.SwaggerDoc("v1", new OpenApiInfo { Title = "EAP API", Version = "v1" });
       }
  );     
---

app.UseSwagger();
app.UseSwaggerUI(options =>
{
    options.SwaggerEndpoint("/swagger/v1/swagger.json", "EAP API");
});

应用会在/Swagger页面加载最基础的API文档。

以一个最简单的Post请求为例,细数这最基础SwaggerUI的弊病

[HttpPost]
public async Task<bool> AddHotmapAsync([FromBody] CreateHotmapInput createHotmapInput)
{
     var model = ObjectMapper.Map<CreateHotmapInput, Hotmap>(createHotmapInput);
     model.ProfileId = CurrentUser.TenantId;
     return await _hotmaps.InsertAsync(model)!= null;
}

产生如图示SwaggerUI:
Oh my God, Swagger API文档竟然可以这样写?第1张

  1. Post请求的Payload字段值相对复杂,竟不给前端传值example?
  2. 没有指示前端请求的Content-Type,前端会不会给你另外一个surprise?
  3. 服务器没有指示响应的Content-Type,?
  4. 服务器没有指示响应的预期状态码,前端会不会抓狂?
    Oh my God, Swagger API文档竟然可以这样写?第2张

下文就来根治这些顽疾, 书写一个自述性、优雅的API文档。

Swagger最佳实践

三下五除二,给出示例:

        /// <summary>
        /// 添加热力图
        /// </summary>
        /// <remarks>
        /// Sample request:
        /// ```
        ///  POST /hotmap
        ///  {
        ///      "displayName": "演示名称1",
        ///      "matchRule": 0,
        ///      "matchCondition": "https://www.cnblogs.com/JulianHuang/",
        ///      "targetUrl": "https://www.cnblogs.com/JulianHuang/",
        ///      "versions": [
        ///      {
        ///         "versionName": "ver2020",
        ///         "startDate": "2020-12-13T10:03:09",
        ///         "endDate": "2020-12-13T10:03:09",
        ///          "offlinePageUrl": "3fa85f64-5717-4562-b3fc-2c963f66afa6",  //  没有绑定图片和离线网页的对应属性传 null
        ///          "pictureUrl": "3fa85f64-5717-4562-b3fc-2c963f66afa6",
        ///          "createDate": "2020-12-13T10:03:09"
        ///      }
        ///    ]
        ///  }
        ///```
        /// </remarks>
        /// <param name="createHotmapInput"></param>
        /// <returns></returns>
        [Consumes("application/json")]
        [Produces("text/plain")]
        [ProducesResponseType(typeof(HotMap), 200)]
        [HttpPost]
        public async Task<bool> AddHotmapAsync([FromBody] CreateHotmapInput createHotmapInput)
        {
            var model = ObjectMapper.Map<CreateHotmapInput, Hotmap>(createHotmapInput);
            model.ProfileId = CurrentUser.TenantId;
            await _hotmaps.InsertAsync(model);
            return "done !, This is Test";
        }
  1. 通过给API添加XML注释

注意如果注释内容包含代码,可以使用Markdown的代码语法```,在注释里面优雅显示代码.

  1. 通过Consumes,Produces特性指示action接收和返回的数据类型,也就是媒体类型。

Consumes、Produces是指示请求/响应支持的content types的过滤器,位于Microsoft.AspNetCore.Mvc命名空间下。

  1. 通过ProducesResponseType特性指示服务器响应的预期内容和状态码

API文档结果:

Oh my God, Swagger API文档竟然可以这样写?第3张

这样的SwaggerUI才正确表达了后端程序员的内心输出。


在Swagger文档上显示注释

  1. 生成XML注释文档
    在项目上[右键]-[属性]-[生成标签页]-[勾选XML文档文件];
    或者直接在项目csproj文件--[PropertyGroup]添加<GenerateDocumentationFile>true</GenerateDocumentationFile>
  2. AddSwaggerGen方法添加下行,启用注释文件
// Set the comments path for the Swagger JSON and UI.
var xmlFile = $"{this.GetType().Assembly.GetName().Name}.xml";
var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
opt.IncludeXmlComments(xmlPath);

这里啰嗦一下,如果是Abp Vnext解决方案(API是定义在HttpApi项目/Application项目),故我们要为Abp Vnext解决方案加载带xml注释的Swagger Json,需要指示xmlFile为HttpApi.xml或者applicaiton.xml

以上就是小码甲总结的书写Swagger文档的优雅姿势:

  • 编写API 传值example
  • 约束请求/响应 支持的媒体类型
  • 指示API的预期输出内容、预期状态码

API自述,约束输入输出,前端同事再也不会追着你撕逼了!

免责声明:文章转载自《Oh my God, Swagger API文档竟然可以这样写?》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇C# 快捷方式 自启动 PHPdrf——drf模型层choice字段使用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

Bing API初体验 z

Bing正式发布没几天,除了功能和搜索结果外,作为开发者来说,我们关心的还有Bing API啥时候能出。周末浏览MSDN网站时,发现Bing Service已经上线了,链接是:http://msdn.microsoft.com/en-us/library/dd900818.aspx Bing提供的API很丰富,除了搜索外,还增加了广告Ad、图片、新闻、Ph...

记一个多线程使用libevent的问题

前段时间使用libevent网络库实现了一个游戏服务器引擎,在此记录下其中遇到的一个问题。 我在设计服务器上选择把逻辑和网络分线程,线程之间通信使用队列。但是这样做会有个问题: 当逻辑线程想要主动的发一个数据包的时候,网络线程此时可能还阻塞在等待网络IO的系统调用上(比如说epoll)。如果不做特殊处理的话,此时消息包就会一直积压在缓冲区中,直到下一次网络...

C#生成XML的三种途径 (分享)

为了全面,这里都将XML保存到文件中,有三种生成XML的方式:1。我认为是最原始,最基本的一种:利用XmlDocument向一个XML文件里写节点,然后再利用XmlDocument保存文件。    首先加载要写入的XML文件,但是如果没有的,就要新建,在新建的过程中,要有写入的代码;                XmlDocument doc = n...

vue-multi-tab--一个让你在SPA里使用多页签的框架页

介绍 vue-multi-tab 是一套基于 vue 和 element-ui 的 , 实现了 tab-router (一个基于 tab 的路由) 的 单页面, 多页签 应用程序. 我之前写这个项目的时候,有写了一篇 记一次基于vue的spa多页签实践经验然后就部分热心网友就在下面回复了一些其他类似的项目,我逐一查看了一下,发现基本都是基于 vue-ro...

使用 JavaScript File API 实现文件上传

概述 以往对于基于浏览器的应用而言,访问本地文件都是一件头疼的事情。虽然伴随着 Web 2.0 应用技术的不断发展,JavaScript 正在扮演越来越重要的角色,但是出于安全性的考虑,JavaScript 一直是无法访问本地文件的。于是,为了在浏览器中能够实现诸如拖拽并上传本地文件这样的功能,我们就不得不求助于特定浏览器所提供的各种技术了。比如对于 IE...

C#操作Xml:XmlSerializer 对象的Xml序列化和反序列化

这篇随笔对应的.Net命名空间是System.Xml.Serialization;文中的示例代码需要引用这个命名空间。 为什么要做序列化和反序列化? .Net程序执行时,对象都驻留在内存中;内存中的对象如果需要传递给其他系统使用;或者在关机时需要保存下来以便下次再次启动程序使用就需要序列化和反序列化。 范围:本文只介绍xml序列化,其实序列化可以是二进...