为什么 Swashbuckle 不遵守套管政策?

问题描述 投票:0回答:1

我有一个带有 Swagger 和 Swashbuckle 代码属性的 ASP.Net Core API,用于生成 UI 文档。 API 的命名策略自始至终都是蛇形命名,这在大多数文档中都很好,但是我在具有 [FromForm] 属性的端点方法中使用了一个数据模型,即它作为 multipart/form-data、Swagger/ 上传Swashbuckle 只是不会转换外壳:

enter image description here

Swashbuckle 文档没用,我尝试过 ISchemaFilter、IOperationFilter 和 IDocumentFilter 但找不到任何东西,我也问过 Github Copilot,它也不知道它在做什么,它一直告诉我使用 IOperationFilter 来设置操作参数名称,我已经在这样做了,但不起作用。

我该怎么做?我想要的只是以下内容:

enter image description here

swagger asp.net-core-webapi swagger-ui swashbuckle
1个回答
0
投票

您可以像下面一样使用 IOperationFilter。请先检查测试结果。

enter image description here

SnakeCaseRequestBodyFilter.cs

using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;
using System.Text.RegularExpressions;

namespace WebApplication2
{
    public class SnakeCaseRequestBodyFilter : IOperationFilter
    {
        public void Apply(OpenApiOperation operation, OperationFilterContext context)
        {
            Regex regex = new Regex("([a-z])([A-Z])");

            foreach (var parameter in operation.Parameters.Where(p => p.In == ParameterLocation.Query || p.In == ParameterLocation.Header || p.In == ParameterLocation.Path || p.In == ParameterLocation.Cookie))
            {
                parameter.Name = regex.Replace(parameter.Name, "$1_$2").ToLower();
            }

            if (operation.RequestBody != null && operation.RequestBody.Content.ContainsKey("multipart/form-data"))
            {
                var formDataContent = operation.RequestBody.Content["multipart/form-data"];
                if (formDataContent.Schema?.Properties != null)
                {
                    var properties = formDataContent.Schema.Properties;

                    foreach (var prop in properties.Keys.ToList())
                    {
                        var snakeCaseKey = regex.Replace(prop, "$1_$2").ToLower();
                        if (snakeCaseKey != prop)
                        {
                            var schema = properties[prop];
                            properties.Remove(prop);
                            properties[snakeCaseKey] = schema;
                        }
                    }
                }
            }
        }
    }
}

注册。

builder.Services.AddSwaggerGen(c =>
{
    c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" });
    c.OperationFilter<SnakeCaseRequestBodyFilter>();  
});
© www.soinside.com 2019 - 2024. All rights reserved.