在 Swashbuckle 中将字符串字段转换为枚举字段

2024-01-03

我们正在使用 Swashbuckle 来记录我们的 WebAPI 项目(使用 Owin),并尝试修改 Swashbuckle 生成的 Swagger 文件。 随着DescribeAllEnumsAsStrings()和如下所示的枚举属性,我们得到预期的结果:

class MyResponseClass {
    public Color color;
}

enum Color {
    LightBlue,
    LightRed,
    DarkBlue,
    DarkRed
}

Swagger 生成的结果:

"color": {
  "enum": [
    "LightBlue",
    "LightRed",
    "DarkBlue",
    "DarkRed"
  ],
  "type": "string"
},

我们面临的挑战是我们有一些类型的属性string但我们实际上将它们视为enum类型。例如:

class MyResponseClass {
    public string color;
}

该属性唯一可能的值为dark-blue, dark-red, light-blue, light-red.

因此,我们想要如下所示的结果:

"color": {
  "enum": [
    "light-blue",
    "light-red",
    "dark-blue",
    "dark-red"
  ],
  "type": "string"
},

我们有很多这样的属性,在不同的类中具有不同的值。如果有一个如下所示的自定义属性以使其通用,那就太好了。我不知道如何创建这样的属性并在 Swashbuckle 中使用它DocumentFilters or OperationFilters:

public MyEndpointResponseClass {

    [StringEnum("booked", "confirmed", "reserved")]
    public string status;

    // Other properties
}

public MyEndpointRequestClass {

    [StringEnum("dark-blue", "dark-red", "light-blue", "light-red")]
    public string color;

    // Other properties
}

使用 swagger 已经知道的属性,而不是自定义属性(StringEnum),使用一点了解属性(我以前从未使用过它):

[RegularExpression("^(dark-blue|dark-red|light-blue|light-red)")]

这将注入到parameter.pattern中,然后我们可以从IDocumentSchema中读取它并将其转换为枚举,这是我的代码:

private class StringEnumDocumentFilter : IDocumentFilter
{
    public void Apply(SwaggerDocument swaggerDoc, SchemaRegistry s, IApiExplorer a)
    {                
        if (swaggerDoc.paths != null)
        {
            foreach (var path in swaggerDoc.paths)
            {
                ProcessOperation(path.Value.get);
                ProcessOperation(path.Value.put);
                ProcessOperation(path.Value.post);
                ProcessOperation(path.Value.delete);
                ProcessOperation(path.Value.options);
                ProcessOperation(path.Value.head);
                ProcessOperation(path.Value.patch);
            }
        }
    }

    private void ProcessOperation(Operation op)
    {
        if (op != null)
        {
            foreach (var param in op.parameters)
            {
                if (param.pattern != null)
                {
                    param.@enum = param.pattern
                        .Replace("^", "")
                        .Replace("(", "")
                        .Replace(")", "")
                        .Split('|');
                }
            }
        }                
    }
}

这是一个工作示例:
http://swashbuckletest.azurewebsites.net/swagger/ui/index?filter=TestStringEnum#/TestStringEnum/TestStringEnum_Post http://swashbuckletest.azurewebsites.net/swagger/ui/index?filter=TestStringEnum#/TestStringEnum/TestStringEnum_Post

其背后的代码位于 GitHub 上:
TestStringEnumController.cs https://github.com/heldersepu/SwashbuckleTest/blob/master/Swagger_Test/Controllers/TestStringEnumController.cs
SwaggerConfig.cs#L389 https://github.com/heldersepu/SwashbuckleTest/blob/master/Swagger_Test/App_Start/SwaggerConfig.cs#L389

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Swashbuckle 中将字符串字段转换为枚举字段 的相关文章

  • .Net Web API 未找到与请求 URI 匹配的 HTTP 资源

    我正在开发 Net Web API 它在调试和本地主机 IIS 上都运行良好 但是当我将其发布到服务器时 它开始给出以下错误 Message 未找到与请求 URI 匹配的 HTTP 资源 在服务器上 我们在该 API 的默认站点下有应用程序
  • 如何从枚举中选择随机值?

    给定 C 中的任意枚举 如何选择随机值 我没有找到这个非常基本的问题 我会在一分钟内发布我的答案作为任何人的参考 但请随意发布你自己的答案 Array values Enum GetValues typeof Bar Random rand
  • 从表单中选择枚举以设置角色

    Ruby on Rails 4 1 我正在将 Devise 与枚举角色一起使用 目前 它在创建用户时使用默认角色 我想在创建用户的表单中添加一个字段来设置枚举角色 I read this https github com RailsApps
  • Visual Studio Code - .net core - 生成xml文档

    我们正在使用Swagger UI描述我们项目 API 的文档 Swagger 必须从中读取 XMLprojectname xml显示所有 C R U D 我们在项目中拥有的功能 问题是当我从 Visual Studio 切换到 Visual
  • WebApi 自定义 JsonConverter 未调用

    我为 Guid 实现了一个自定义 JsonConverter 如果我在像这样序列化的类的属性 Guid 类型 上声明它 JsonConverter typeof JsonGuidConverter 然后它被调用并且工作正常 但是 我想 自动
  • 在选中的复选框中发布表单时 ModelState 无效

    我遇到以下问题 如果我通过 AJAX 向 api 控制器提交包含复选框中选中值的表单 ModelState 对象会说它无效 先决条件 视觉工作室2012 ASP NET MVC 4 最终版 最新的 jQuery 和 jQuery 不显眼的验
  • ASP.NET Core 1.0 Web API 中的简单 JWT 身份验证

    我正在寻找最简单的方法来设置使用 JWT 在 ASP NET Core 又名 ASP NET 5 中进行身份验证的 Web API 服务器 这个项目 博客文章 http www codeproject com Articles 369657
  • 向 ASP.NET WebApi 2.2 添加身份验证

    我创建了一个 WebApi 2 2 项目 来自一个空的新 ASP NET 项目 来证明一些实现概念 现在我想向其中添加身份验证 我注意到在新的 WebApi 应用程序上添加身份验证的唯一方法是使用模板之一 在我的例子中是 VS 2013 是
  • 无法构造 String 类型

    我正在使用 Web api 和 Unity 并且在尝试打开默认 帮助 区域时收到以下错误 InvalidOperationException The type String cannot be constructed You must co
  • 适用于 Web 和移动设备的 ASP.NET Web API 社交身份验证

    我的问题有点复杂 所以请耐心等待我 因为我试图很好地阐明我正在努力解决的问题 Goal 拥有一个 ASP NET 网站 允许用户通过用户名 密码或也具有 API 的社交网站 Facebook Twitter Google 等 注册和登录 该
  • 如何在Python中比较枚举?

    从 Python 3 4 开始 Enum类存在 我正在编写一个程序 其中一些常量具有特定的顺序 我想知道哪种方式最适合比较它们 class Information Enum ValueOnly 0 FirstDerivative 1 Sec
  • 将身份验证添加到 /swagger/ui/index 页面 - Swagger |网络应用程序接口 |虚张声势

    我正在开发一个 Swagger Web API 项目 当我第一次运行该应用程序时 它显示 Swagger UI 的登录页面 因此 用户首先必须登录才能访问 Swagger UI 页面 但是 如果用户直接输入 http example com
  • 将 Swagger 描述添加到最小的 .NET 6 API

    我在 NET 6 中有一个小项目 其中包含类似的最少 API app MapGet clients async IClientRepository repo gt var results await repo GetClientsAsync
  • 如何将带有自定义标头的任意 JSON 数据发送到 REST 服务器?

    TL DR 如何将 JSON 字符串发送到带有 auth 标头的 REST 主机 我尝试了 3 种不同的方法 发现一种适用于匿名类型 为什么我不能使用匿名类型 我需要设置一个名为 Group Name 的变量 并且连字符不是有效的 C 标识
  • const int 列表而不是 enum

    我开始研究大型 C 代码库 并发现使用带有多个 const ints 字段的静态类 这个类的行为与枚举完全一样 我想将类转换为实际的枚举 但权力被拒绝 我想转换它的主要原因是这样我可以将枚举作为数据类型而不是 int 这对可读性有很大帮助
  • Grails GORM 和枚举

    我在 Grails 中使用枚举时遇到问题 我尝试在 grails 域对象中使用枚举 code package it xxx tools kanban import java util Date class Task String name
  • C 中的函数指针和枚举

    我正在寻找一种链接函数指针和枚举的奇特方法 就我而言 我有一个消息队列 其中包含事件 ID 和与事件关联的一些数据 一些简单的伪代码 event eid data switch eid case eid1 handler1 data bre
  • 如何让 Swagger UI 的参数成为下拉菜单而不是文本输入

    我正在使用 swagger 来显示我的 RESTApi API 的一个参数将字符串作为输入并将其转换为枚举值 有没有办法在 Swagger UI 上显示下拉菜单而不是文本输入字段 以便用户只能选择枚举值中的字符串值 您可以使用以下 swag
  • 使 WebAPI 操作异步?

    我有一个问题 关于在 WebAPI MVC 控制器 AJAX 请求上使用 async await 是否有益 假设我有一个与 Web API 后端对话的 AngularJS 应用程序 并且我想获取一些数据 我对 Web API 进行了一些 A
  • OWIN / Katana 未处理的异常全局处理程序?

    在 Katana OWIN 实现中实现全局异常捕获器处理程序的正确方法是什么 在作为 Azure 云服务 辅助角色 运行的自托管 OWIN Katana 实现中 我将此代码放置在中间件中 throw new Exception pooo 然

随机推荐