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

简介: 为避免联调时来回撕逼,今天我们聊一聊正确编写Swaager API文档的姿势。

基础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请求为例,细数这最基础Swagger文档的弊病


[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:


f6d3632916c377fe840f1a19ebcc099f.png


  1. Post请求的Payload字段过于复杂,竟不给前端传值example?


  1. 没有约定请求的媒体类型,前端会不会给你另外一个surprise?


  1. API 文档没有指示响应的媒体类型,前端以哪种姿势接收?


  1. API文档没有指示响应的预期输出内容、状态码,前端会不会抓狂?


下文就来根治这些顽疾, 书写一个自述性、优雅的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/plan")]
[ProducesResponseType(typeof(Boolean), 200)]
[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;
}


  1. 通过给API添加XML注释:remarks


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


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


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


  1. 通过ProducesResponseType特性指示API响应的预期内容、状态码

API文档显示如下:


865e6d8baf2ace1f9b567297804302d0.png


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


在Swagger文档上显示注释


  1. 生成XML文档文件在项目上[右键]-[属性]-[生成标签页]-[勾选XML文档文件];或者直接在项目csproj文件--[PropertyGroup]添加<GenerateDocumentationFile>true</GenerateDocumentationFile>


  1. 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。

相关文章
|
2月前
|
API
阿里云短信服务文档与实际API不符
阿里云短信服务文档与实际API不符
|
29天前
|
Java 测试技术 API
详解Swagger:Spring Boot中的API文档生成与测试工具
详解Swagger:Spring Boot中的API文档生成与测试工具
38 4
|
5月前
|
Java API 开发者
在Spring Boot中集成Swagger API文档
在Spring Boot中集成Swagger API文档
|
1月前
|
JSON 前端开发 API
后端开发中的API设计与文档编写指南####
本文探讨了后端开发中API设计的重要性,并详细阐述了如何编写高效、可维护的API接口。通过实际案例分析,文章强调了清晰的API设计对于前后端分离项目的关键作用,以及良好的文档习惯如何促进团队协作和提升开发效率。 ####
|
2月前
|
安全 Java API
SpringSecurity结合knife4j实现swagger文档
通过将Spring Security与Knife4j相结合,我们不仅能够为RESTful API提供强大的安全防护,还能保证API文档的易用性和可访问性,这对于API的设计、开发和维护来说至关重要。这种集成方式不仅提升了开发效率,也优化了API使用者的体验,是现代API驱动开发中不可或缺的一环。
123 0
|
4月前
|
JSON 测试技术 API
Python开发解析Swagger文档小工具
文章介绍了如何使用Python开发一个解析Swagger文档的小工具,该工具可以生成符合httprunner测试框架的json/yaml测试用例,同时还能输出Excel文件,以方便测试人员根据不同需求使用。文章提供了详细的开发步骤、环境配置和使用示例,并鼓励读者为该开源项目贡献代码和建议。
113 1
Python开发解析Swagger文档小工具
|
4月前
|
Java API 数据中心
百炼平台Java 集成API上传文档到数据中心并添加索引
本文主要演示阿里云百炼产品,如何通过API实现数据中心文档的上传和索引的添加。
151 3
|
4月前
|
XML 开发框架 .NET
ASP.NET Web Api 如何使用 Swagger 管理 API
ASP.NET Web Api 如何使用 Swagger 管理 API
132 1
|
4月前
|
JSON API 数据格式
【Azure API 管理】是否可以将Swagger 的API定义导入导Azure API Management中
【Azure API 管理】是否可以将Swagger 的API定义导入导Azure API Management中
|
5月前
|
安全 Java API
Nest.js 实战 (三):使用 Swagger 优雅地生成 API 文档
这篇文章介绍了Swagger,它是一组开源工具,围绕OpenAPI规范帮助设计、构建、记录和使用RESTAPI。文章主要讨论了Swagger的主要工具,包括SwaggerEditor、SwaggerUI、SwaggerCodegen等。然后介绍了如何在Nest框架中集成Swagger,展示了安装依赖、定义DTO和控制器等步骤,以及如何使用Swagger装饰器。文章最后总结说,集成Swagger文档可以自动生成和维护API文档,规范API标准化和一致性,但会增加开发者工作量,需要保持注释和装饰器的准确性。
151 0
Nest.js 实战 (三):使用 Swagger 优雅地生成 API 文档