Тело запроса SnakeCase игнорирует формат - PullRequest
2 голосов
/ 06 февраля 2020

Мне нужно настроить мой. NET базовый API-интерфейс на случай змеи, поэтому при запуске я добавил:

.AddNewtonsoftJson(options =>
                {
                    options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore;
                    options.SerializerSettings.ContractResolver = new DefaultContractResolver() { NamingStrategy = new SnakeCaseNamingStrategy() };
                })

и сделал два фильтра для чванства:

public class SwaggerSnakeCaseParameterFilter : IParameterFilter
    {
        private readonly SnakeCaseNamingStrategy _namingStrategy = new SnakeCaseNamingStrategy();

        public void Apply(OpenApiParameter parameter, ParameterFilterContext context)
        {
            parameter.Name = _namingStrategy.GetPropertyName(parameter.Name, false);
        }
    }
public class SwaggerSnakeCaseDocumentFilter : IDocumentFilter
    {
        private readonly SnakeCaseNamingStrategy _namingStrategy = new SnakeCaseNamingStrategy();

        public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context)
        {
            foreach (var path in swaggerDoc.Paths.ToArray())
            {
                var apiDescription = context.ApiDescriptions.First(ad => "/" + ad.RelativePath == path.Key);
                var newKey = path.Key;
                foreach (var parameterDescription in apiDescription.ParameterDescriptions.Where(pd =>
                    pd.Source == BindingSource.Path))
                {
                    newKey = newKey.Replace(
                        "{" + parameterDescription.Name + "}",
                        "{" + _namingStrategy.GetPropertyName(parameterDescription.Name, false) + "}");
                }

                swaggerDoc.Paths.Remove(path.Key);
                swaggerDoc.Paths.Add(newKey, path.Value);
            }
        }
    }

Но тело запроса и тело ответа по-прежнему отображаются как CamelCase на Swagger. Что мне не хватает? Параметры из запроса и маршрута работают нормально.

1 Ответ

1 голос
/ 06 февраля 2020

Какую версию Swashbuckle вы используете? Если вы используете версию 5, она использует System.Text.Json для сериализации. Поскольку вы используете Newtonsoft, он будет игнорировать все, что вы настроили для сериализации Newtonsoft.

Вы можете настроить Swashbuckle на использование Newtonsoft вместо System.Text.Json, если хотите:

  • Добавить ссылку на Swashbuckle.AspNetCore.Newtonsoft
  • Добавить вызов services.AddSwaggerGenNewtonsoftSupport() в Startup.cs после вызова AddSwaggerGen()

Readme Swashbuckle Readme включает в себя больше информация об этом, если вы заинтересованы.

...