¿Hay alguna manera de mostrar todas las enumeraciones como su valor de cadena en swagger en lugar de su valor int?
Quiero poder enviar acciones POST y poner enumeraciones de acuerdo con su valor de cadena sin tener que mirar la enumeración cada vez.
Lo intenté, DescribeAllEnumsAsStrings
pero el servidor recibe cadenas en lugar del valor de enumeración, que no es lo que estamos buscando.
¿Alguien ha resuelto esto?
Editar:
public class Letter
{
[Required]
public string Content {get; set;}
[Required]
[EnumDataType(typeof(Priority))]
public Priority Priority {get; set;}
}
public class LettersController : ApiController
{
[HttpPost]
public IHttpActionResult SendLetter(Letter letter)
{
// Validation not passing when using DescribeEnumsAsStrings
if (!ModelState.IsValid)
return BadRequest("Not valid")
..
}
// In the documentation for this request I want to see the string values of the enum before submitting: Low, Medium, High. Instead of 0, 1, 2
[HttpGet]
public IHttpActionResult GetByPriority (Priority priority)
{
}
}
public enum Priority
{
Low,
Medium,
High
}
Respuestas:
De los documentos :
Además, si desea este comportamiento solo en un tipo y propiedad en particular, use StringEnumConverter:
fuente
DescribeAllEnumsAsStrings
Trabajó para propiedades de objetos e incluso parámetros de consulta sobre acciones del controlador. Sin embargo, usarEnumDataTypeAttribute
yJsonConverter(typeof(StringEnumConverter))
no funcionó para mí.Para ASP.NET Core 3 con la biblioteca JSON de Microsoft (System.Text.Json)
En Startup.cs / ConfigureServices ():
Para ASP.NET Core 3 con la biblioteca Json.NET (Newtonsoft.Json)
Instale el
Swashbuckle.AspNetCore.Newtonsoft
paquete.En Startup.cs / ConfigureServices ():
Para ASP.NET Core 2
En Startup.cs / ConfigureServices ():
Pre-ASP.NET Core
fuente
AzureExtensions.Swashbuckle
paquete, pero al igual que @DanFriedman no puedo hacer que la enumeración a cadena funcione como se esperabaEntonces creo que tengo un problema similar. Estoy buscando swagger para generar enumeraciones junto con el mapeo de cadenas int ->. La API debe aceptar el int. El swagger-ui importa menos, lo que realmente quiero es la generación de código con una enumeración "real" en el otro lado (aplicaciones de Android que usan retrofit en este caso).
Entonces, a partir de mi investigación, esto en última instancia parece ser un límite de la especificación de OpenAPI que usa Swagger. No es posible especificar nombres y números para enumeraciones.
El mejor problema que encontré para seguir es https://github.com/OAI/OpenAPI-Specification/issues/681 que parece un "quizás pronto", pero luego Swagger tendría que actualizarse, y en mi caso Swashbuckle como bien.
Por ahora, mi solución ha sido implementar un filtro de documento que busca enumeraciones y completa la descripción relevante con el contenido de la enumeración.
SwaggerAddEnumDescriptions.cs:
Esto da como resultado algo como lo siguiente en su swagger-ui para que al menos pueda "ver lo que está haciendo":
fuente
ASP.NET Core 3.1
Para generar enumeraciones como cadenas usando Newtonsoft JSON, debe agregar explícitamente el soporte de Newtonsoft agregando
AddSwaggerGenNewtonsoftSupport()
lo siguiente:Este servicio está disponible a través de un nuevo paquete,
Swashbuckle.AspNetCore.Newtonsoft
. Parece que todo lo demás funciona bien sin este paquete, aparte del soporte del convertidor de enumeración.fuente
StringEnumConverter
como un caso especial.Quería usar la respuesta de rory_za en una aplicación .NET Core, pero tuve que modificarla un poco para que funcionara. Aquí está la implementación que se me ocurrió para .NET Core.
También lo cambié para que no asuma que el tipo subyacente es
int
, y uso nuevas líneas entre los valores para facilitar la lectura.Luego agregue esto a su
ConfigureServices
método en Startup.cs:fuente
DescribeEnumParameters
estaban vacías en mi proyecto. Tuve que lanzar elparam
toNonBodyParameter
y verificar la enumeración allí:if (param is NonBodyParameter nbParam && nbParam.Enum?.Any() == true) { param.Description += DescribeEnum(nbParam.Enum); }
Con asp.net core 3
Pero parece que Swashbuckle Version 5.0.0-rc4 no está lista para admitir eso. Por lo tanto, debemos usar una opción (en desuso) en el archivo de configuración Swashbuckle hasta que lo admita y refleje como la biblioteca Newtonsoft.
La diferencia entre esta respuesta y otras respuestas es usar solo la biblioteca JSON de Microsoft en lugar de Newtonsoft.
fuente
.NET CORE 3.1 y SWAGGER 5
si necesita una solución simple para hacer selectivamente enumeraciones pasadas como cadenas:
Tenga en cuenta que usamos el
System.Text.Json.Serialization
espacio de nombres, no elNewtonsoft.Json
!fuente
System.Text.Json
.DescribeAllEnumsAsStrings
convertiré todas las enumeraciones en la cadena.si alguien está interesado, he modificado el código para trabajar
.NET CORE 3 y Swagger V5
fuente
¡Acabo de hacer esto y funciona bien!
Startup.cs
Model.cs
swagger.json
¡Espero que esto te ayude en lo que me ayudó a mí!
fuente
DescribeAllEnumsAsStrings
está obsoletofuente
Mi variante para picaduras de enumeración con valores:
Configurar servicios:
Filtrar:
fuente
escribir código dentro de Startup.cs
fuente
He encontrado una buena solución aquí:
@PauloVetor - lo resolvió usando ShemaFilter así:
Y en Startup.cs:
fuente
model.Format
a"string"
como será generalmente"int32"
..Net Core 3.0
fuente
He modificado la respuesta de Hosam Rehani para que funcione con enumeraciones que aceptan valores NULL y también con una colección de enumeraciones. La respuesta anterior también funciona solo si una propiedad se nombra exactamente como su tipo. Todos estos problemas se tratan en el código siguiente.
Funciona con .net core 3.xy swagger 5.x.
podría ser más eficiente si no buscara el tipo enum dos veces en algunos casos.
para usar el filtro agregar
c.DocumentFilter<SwaggerAddEnumDescriptions>();
a la configuración swagger enStartup.cs
.fuente
SOLUCIÓN ASP NET
En mis documentos de API, una enumeración todavía se mostraba como int a pesar de que la propiedad estaba marcada con
StringEnumConverter
. No podíamos permitirnos usar la configuración global para todas las enumeraciones mencionadas anteriormente. Agregar esta línea en SwaggerConfig resolvió el problema:fuente
Hubo una serie de deficiencias que encontré en las otras respuestas para lo que estábamos buscando, así que pensé en dar mi propia opinión sobre esto. Estamos usando ASP.NET Core 3.1 con System.Text.Json, pero nuestro enfoque funciona independientemente del serializador JSON utilizado.
Nuestro objetivo era aceptar valores de cadena de enumeración en mayúsculas y minúsculas en la API de ASP.NET Core y documentar lo mismo en Swagger. Actualmente estamos haciendo uso de
[DataContract]
y[EnumMember]
, por lo que el enfoque es tomar el valor menor en caja de camello de la propiedad de valor EnumMember y usarlo en todos los ámbitos.Nuestra enumeración de muestra:
Usaremos los valores de EnumMember en Swashbuckle usando un ISchemaFilter como se muestra a continuación:
Estamos usando un paquete NuGet de terceros ( repositorio de GitHub ) para garantizar que este esquema de nomenclatura también se utilice en ASP.NET Core. Configúrelo en Startup.cs dentro de ConfigureServices con:
Finalmente, necesitamos registrar nuestro ISchemaFilter en Swashbuckle, así que también agregue lo siguiente también en ConfigureServices ():
fuente
GetMembers()
sería mejorGetMembers(BindingFlags.Static | BindingFlags.Public)
limitar solo a las propiedades de enumeración declaradas reales, como "Azul". También adapté el caso "else" para devolver el Member.Name si no hay ningún[EnumMember]
atributo.Esto no es posible con OpenAPI estándar. Las enumeraciones se describen solo con sus valores de cadena.
Afortunadamente, puede hacerlo con algunas extensiones no estándar que utiliza su generador de clientes.
Soportes NSwag
x-enumNames
Soportes AutoRest
x-ms-enum
.Soportes del generador Openapi
x-enum-varnames
Otros generadores pueden admitir una de estas extensiones o tener la suya propia.
Para generar
x-enumNames
para NSwag, cree el siguiente filtro de esquema:Y regístrelo como:
fuente
Si la versión del swagger era 5.5.x, entonces necesita:
instalar: Install-Package Swashbuckle.AspNetCore.Newtonsoft -Version 5.5.0
services.AddSwaggerGenNewtonsoftSupport ();
Referencia: https://github.com/domaindrivendev/Swashbuckle.AspNetCore#systemtextjson-stj-vs-newtonsoft
fuente