Vì vậy, tôi nghĩ rằng tôi có một vấn đề tương tự. Tôi đang tìm kiếm swagger để tạo enums cùng với ánh xạ chuỗi int ->. API phải chấp nhận int. Vấn đề thấp hơn là swagger-ui, những gì tôi thực sự muốn là tạo mã với một enum "thực" ở phía bên kia (các ứng dụng android sử dụng trang bị thêm trong trường hợp này).
Vì vậy, từ nghiên cứu của tôi, đây dường như là một giới hạn của đặc tả OpenAPI mà Swagger sử dụng. Không thể chỉ định tên và số cho enums.
Vấn đề tốt nhất mà tôi tìm thấy để theo dõi là https://github.com/OAI/OpenAPI-Specification/issues/681 trông giống như một "có thể sớm" nhưng sau đó Swagger sẽ phải được cập nhật và trong trường hợp của tôi, Swashbuckle là tốt.
Hiện tại, cách giải quyết của tôi là triển khai bộ lọc tài liệu tìm kiếm enum và điền mô tả có liên quan với nội dung của enum.
GlobalConfiguration.Configuration
.EnableSwagger(c =>
{
c.DocumentFilter<SwaggerAddEnumDescriptions>();
//disable this
//c.DescribeAllEnumsAsStrings()
SwaggerAddEnumDescriptions.cs:
using System;
using System.Web.Http.Description;
using Swashbuckle.Swagger;
using System.Collections.Generic;
public class SwaggerAddEnumDescriptions : IDocumentFilter
{
public void Apply(SwaggerDocument swaggerDoc, SchemaRegistry schemaRegistry, IApiExplorer apiExplorer)
{
// add enum descriptions to result models
foreach (KeyValuePair<string, Schema> schemaDictionaryItem in swaggerDoc.definitions)
{
Schema schema = schemaDictionaryItem.Value;
foreach (KeyValuePair<string, Schema> propertyDictionaryItem in schema.properties)
{
Schema property = propertyDictionaryItem.Value;
IList<object> propertyEnums = property.@enum;
if (propertyEnums != null && propertyEnums.Count > 0)
{
property.description += DescribeEnum(propertyEnums);
}
}
}
// add enum descriptions to input parameters
if (swaggerDoc.paths.Count > 0)
{
foreach (PathItem pathItem in swaggerDoc.paths.Values)
{
DescribeEnumParameters(pathItem.parameters);
// head, patch, options, delete left out
List<Operation> possibleParameterisedOperations = new List<Operation> { pathItem.get, pathItem.post, pathItem.put };
possibleParameterisedOperations.FindAll(x => x != null).ForEach(x => DescribeEnumParameters(x.parameters));
}
}
}
private void DescribeEnumParameters(IList<Parameter> parameters)
{
if (parameters != null)
{
foreach (Parameter param in parameters)
{
IList<object> paramEnums = param.@enum;
if (paramEnums != null && paramEnums.Count > 0)
{
param.description += DescribeEnum(paramEnums);
}
}
}
}
private string DescribeEnum(IList<object> enums)
{
List<string> enumDescriptions = new List<string>();
foreach (object enumOption in enums)
{
enumDescriptions.Add(string.Format("{0} = {1}", (int)enumOption, Enum.GetName(enumOption.GetType(), enumOption)));
}
return string.Join(", ", enumDescriptions.ToArray());
}
}
Điều này dẫn đến một cái gì đó giống như sau trên swagger-ui của bạn, vì vậy ít nhất bạn có thể "biết những gì bạn đang làm":