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

news/2024/7/19 13:40:40 标签: css, html, web, js, javascript
htmledit_views">
js_content">

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

作为后端程序员,免不了与前端同事对接API, 一个书写良好的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:

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

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

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

  4. 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文档显示如下:

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


在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的预期输出内容、预期状态码

内容自述,格式工整,前端同事再也不会追着你撕逼了!


http://www.niftyadmin.cn/n/1864570.html

相关文章

SQL常见基础疑点问答总结

以下文章都是摘自fcuandy 的&#xff0c;供自己和大家参考。 --建立测试环境IFobject_id(tb) ISNOTNULLDROPTABLEtb GOCREATETABLEtb(id INTIDENTITY(1,1),v VARCHAR(10)) GOINSERTtb SELECTaUNIONALLSELECTbINSERTtb SELECTxUNIONALLSELECTzGO(1)字串变量当数据库对象用 SQL c…

有关Quartz.NET,与一线码农大佬对个线?

跟[一线码农大佬]翻译的某技术文对个线最近看到一线码农大佬翻译的《如何在 ASP.NET Core 中使用 Quartz.NET 执行任务调度》&#xff0c;行文思路&#xff1a;安装Quartz.NETQuartz.NET 中的Job,triggers 和 Schedulers创建 Scheduler开启和停止 scheduler创建 job 工厂创建 J…

JS四舍五入

//保留小数点后两位function Transfer(num){var _value parseFloat(num);if(isNaN(_value)){return;}num _value.toFixed(2);return num;} 转载于:https://www.cnblogs.com/xjyggd/archive/2008/07/31/1257364.html

敏捷 | 如何正确理解敏捷?

【敏捷开发】| 作者/Edison Zhou在过去的五年时间里&#xff0c;我所在的公司和团队一直使用的都是敏捷开发模式&#xff0c;我也在2018年底获取了Scrum联盟的CSM认证&#xff0c;对于敏捷的理解也是从最初的感性认识到现在的理性认识。今天开始和你一起重新温习敏捷&#xff0…

《单元测试之道》读书笔记

What to Test: Right-BICEP Right---结果是否正确 B&#xff0d;&#xff0d;边界条件 I&#xff0d;&#xff0d;检查反向关联&#xff08;用相反的逻辑关系来验证&#xff09; C&#xff0d;&#xff0d;交叉检查 E&#xff0d;&#xff0d;Error是否可以强制错误条件发生&am…

Abp vNext异常处理的缺陷/改造方案

之前吐槽Abp的用户/租户管理模块&#xff01;今天我又来了&#xff0c;这次我给Abp官方repo提了一个issue。目前Website使用Abp vNext开发&#xff0c;免不了要全局处理异常、提示服务器异常信息。1. Abp官方异常处理Abp项目默认会启动内置的异常处理&#xff0c;默认不将异常信…

浅议 Task 底层的调度机制 TaskScheduler

相信大家对 Task 已经非常熟悉了&#xff0c;在 Task 底层有一个发动机&#xff0c;决定了它是涡轮增压还是自然吸气&#xff0c;它就是 TaskScheduler 抽象类&#xff0c;在框架下这个发动机有两个默认实现子类&#xff1a;ThreadPoolTaskScheduler 和 SynchronizationContext…

姑苏慕容与软件开发

一、逆向工程 那女子悠悠的道&#xff1a;“丐帮‘打狗棒法’与‘降龙十八掌’两大神技&#xff0c;是丐帮的不传之秘。你们‘还施水阁’和我家‘琅擐玉洞’的藏谱拼凑起来&#xff0c;也只一些残缺不全的棒法、掌法。运功的心法却全然没有。你家公子可怎生练&#xff1f;”阿朱…