我有一个带有 Swagger 和 Swashbuckle 代码属性的 ASP.Net Core API,用于生成 UI 文档。 API 的命名策略自始至终都是蛇形命名,这在大多数文档中都很好,但是我在具有 [FromForm] 属性的端点方法中使用了一个数据模型,即它作为 multipart/form-data、Swagger/ 上传Swashbuckle 只是不会转换外壳:
Swashbuckle 文档没用,我尝试过 ISchemaFilter、IOperationFilter 和 IDocumentFilter 但找不到任何东西,我也问过 Github Copilot,它也不知道它在做什么,它一直告诉我使用 IOperationFilter 来设置操作参数名称,我已经在这样做了,但不起作用。
我该怎么做?我想要的只是以下内容:
您可以像下面一样使用 IOperationFilter。请先检查测试结果。
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>();
});