【问题标题】:Customizing auto generated Swagger definitions自定义自动生成的 Swagger 定义
【发布时间】:2021-02-22 14:22:50
【问题描述】:

我有 swagger 设置,以便它基于我的 WebApi 中的控制器使用 NSwag 在项目启动时生成开放的 Api 规范和 Swagger Ui。 我想增强招摇的 Ui 以包括

  • 每个端点的摘要/描述
  • 需要它们的端点的示例参数输入
  • POST 调用的示例请求正文
  • 一个示例访问令牌,只能在 swagger 文档中使用,以便轻松进行身份验证并能够尝试一切(有点像本示例中的 https://petstore.swagger.io/)

我是 NSwag 的新手,不确定如何将这些增强功能添加到我的代码中,比如在哪里添加它们,我需要使用什么(控制器上的注释?XML cmets?另一种方式?)我试过编辑'Swagger Editor' 中的规范,但不知道这是怎么回事,因为它会在每次应用程序启动时重新生成。

我已经阅读了 NSwag 文档,但这似乎是关于添加我已经配置的 ASP.NET Core 中间件。

编辑: 我现在在页面顶部有一个描述,并且已经能够在 XML cmets 中添加一个带有备注标签的示例 - 有没有比使用 XML cmets 更优雅的方法来做到这一点?

【问题讨论】:

    标签: asp.net-core-webapi swagger-ui openapi swagger-editor nswag


    【解决方案1】:

    页面顶部的描述

    要使用 Nswag 自定义 API 信息和描述,在 Startup.ConfigureServices 方法中,传递给 AddSwaggerDocument 方法的配置操作会添加作者、许可证和描述等信息:

            services.AddSwaggerDocument(config =>
            {
                config.PostProcess = document =>
                {
                    document.Info.Version = "v1";
                    document.Info.Title = "ToDo API";
                    document.Info.Description = "A simple ASP.NET Core web API";
                    document.Info.TermsOfService = "None";
                    document.Info.Contact = new NSwag.OpenApiContact
                    {
                        Name = "Shayne Boyer",
                        Email = string.Empty,
                        Url = "https://twitter.com/spboyer"
                    };
                    document.Info.License = new NSwag.OpenApiLicense
                    {
                        Name = "Use under LICX",
                        Url = "https://example.com/license"
                    };
                };
            });
    

    Swagger UI 显示版本信息如下:

    • 每个端点的摘要/描述 示例参数输入
    • 需要它们的端点 POST 调用的示例请求正文
    • 只能在 swagger 中使用的示例访问令牌
    • 文档可轻松进行身份验证并能够尝试一切 (有点像这个例子https://petstore.swagger.io/)

    您可以通过将以下元素添加到操作标题来添加描述/示例。

    使用<summary> 元素来描述端点。

    使用<remarks> 元素补充<summary> 元素中指定的信息,并提供更强大的Swagger UI。 <remarks> 元素内容可以由文本、JSON 或 XML 组成。您也可以使用它来添加样本。

    使用<param> 元素添加所需的参数。此外,您还可以在 Model 中使用 Data annotations 属性,它会改变 UI 行为。

    使用<response> 元素来描述响应类型。

    示例代码如下:

        /// <summary>
        /// Creates a TodoItem.
        /// </summary>
        /// <remarks>
        /// Sample request:
        ///
        ///     POST /Todo
        ///     {
        ///        "id": 1,
        ///        "name": "Item1",
        ///        "isComplete": true
        ///     }
        ///
        /// </remarks>
        /// <param name="todoitem"></param>
        /// <returns>A newly created TodoItem</returns>
        /// <response code="201">Returns the newly created item</response>
        /// <response code="400">If the item is null</response>
        #region snippet_CreateActionAttributes
        [ProducesResponseType(StatusCodes.Status201Created)]     // Created
        [ProducesResponseType(StatusCodes.Status400BadRequest)]  // BadRequest
        #endregion snippet_CreateActionAttributes
        #region snippet_CreateAction
        [HttpPost]
        public ActionResult<TodoItem> Create(TodoItem todoitem)
        {
            _context.TodoItems.Add(todoitem);
            _context.SaveChanges();
    
            return CreatedAtRoute("GetTodo", new { id = todoitem.Id }, todoitem);
        }
    

    Swagger UI 现在如下所示:

    更多详细信息,请查看以下教程:

    Customize API documentation using NSwag

    Customize API info and description using Swashbuckle

    【讨论】:

      【解决方案2】:

      现在想通了,最终使用操作处理器来配置 Swagger UI/OpenApi 端点摘要、请求示例、路径参数示例值和可能的 UI 响应代码

      没有很多在线文档可以做到这一点(我只能找到 XML 注释方式,所以这需要大量的试验和错误才能使其工作)

      在这里为不想用 XML cmets 弄乱他们的控制器的其他人发布我的解决方案。

      1. 将 OpenApiOperationProcessor 属性应用于控制器操作

      2. 创建操作处理器并编写 SwaggerUI 自定义代码

      3. 路径参数的示例值可以这样填写

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-04-18
        • 2016-12-26
        • 2018-08-12
        • 1970-01-01
        • 2017-08-25
        相关资源
        最近更新 更多