Existe uma maneira de exibir todos os enums como seu valor de string em swagger em vez de seu valor int?
Quero ser capaz de enviar ações POST e colocar enums de acordo com seu valor de string sem ter que olhar para enum todas as vezes.
Tentei, DescribeAllEnumsAsStrings
mas o servidor recebe strings em vez do valor enum, que não é o que estamos procurando.
Alguém resolveu isso?
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
}
Respostas:
Dos documentos :
Além disso, se você deseja esse comportamento apenas em um determinado tipo e propriedade, use StringEnumConverter:
fonte
DescribeAllEnumsAsStrings
trabalhou para propriedades de objeto e até mesmo parâmetros de consulta em ações do controlador. No entanto, usarEnumDataTypeAttribute
eJsonConverter(typeof(StringEnumConverter))
não funcionou para mim.Para ASP.NET Core 3 com a biblioteca Microsoft JSON (System.Text.Json)
Em Startup.cs / ConfigureServices ():
Para ASP.NET Core 3 com a biblioteca Json.NET (Newtonsoft.Json)
Instale o
Swashbuckle.AspNetCore.Newtonsoft
pacote.Em Startup.cs / ConfigureServices ():
Para ASP.NET Core 2
Em Startup.cs / ConfigureServices ():
Pre-ASP.NET Core
fonte
AzureExtensions.Swashbuckle
pacote, mas como @DanFriedman, não consigo fazer o enum-to-string funcionar como esperadoEntão, acho que tenho um problema semelhante. Estou procurando swagger para gerar enums junto com o mapeamento de string int ->. A API deve aceitar o int. O swagger-ui importa menos, o que eu realmente quero é a geração de código com um enum "real" do outro lado (apps para Android usando retrofit neste caso).
Então, de acordo com minha pesquisa, isso parece ser um limite da especificação OpenAPI que o Swagger usa. Não é possível especificar nomes e números para enums.
O melhor problema que descobri para seguir é https://github.com/OAI/OpenAPI-Specification/issues/681 que parece um "talvez em breve", mas o Swagger teria que ser atualizado e, no meu caso, Swashbuckle como bem.
Por enquanto, minha solução alternativa foi implementar um filtro de documento que procura enums e preenche a descrição relevante com o conteúdo do enum.
SwaggerAddEnumDescriptions.cs:
Isso resulta em algo como o seguinte em seu swagger-ui para que pelo menos você possa "ver o que está fazendo":
fonte
ASP.NET Core 3.1
Para gerar enums como strings usando Newtonsoft JSON, você deve adicionar explicitamente o suporte a Newtonsoft adicionando
AddSwaggerGenNewtonsoftSupport()
o seguinte:Isso está disponível por meio de um novo pacote
Swashbuckle.AspNetCore.Newtonsoft
,. Parece que todo o resto funciona bem sem este pacote, exceto o suporte ao conversor de enum.fonte
StringEnumConverter
como um caso especial.Eu queria usar a resposta de rory_za em um aplicativo .NET Core, mas tive que modificá-la um pouco para que funcionasse. Aqui está a implementação que criei para o .NET Core.
Eu também mudei para que não presuma que o tipo subjacente seja
int
, e use novas linhas entre os valores para facilitar a leitura.Em seguida, adicione isso ao seu
ConfigureServices
método em Startup.cs:fonte
DescribeEnumParameters
estavam vazias no meu projeto. Tive que lançar oparam
paraNonBodyParameter
e verificar o enum lá:if (param is NonBodyParameter nbParam && nbParam.Enum?.Any() == true) { param.Description += DescribeEnum(nbParam.Enum); }
Com asp.net core 3
Mas parece que a versão 5.0.0-rc4 do Swashbuckle não está pronta para suportar isso. Portanto, precisamos usar uma opção (obsoleta) no arquivo de configuração do Swashbuckle até que ela a suporte e reflita como a biblioteca Newtonsoft.
A diferença entre esta resposta e outras respostas é usar apenas a biblioteca JSON da Microsoft em vez de Newtonsoft.
fonte
.NET CORE 3.1 e SWAGGER 5
se você precisar de uma solução simples para fazer enums seletivamente passados como strings:
Observe, usamos o
System.Text.Json.Serialization
namespace, não oNewtonsoft.Json
!fonte
System.Text.Json
.DescribeAllEnumsAsStrings
vou converter todos os enums para a string.se alguém estiver interessado, eu modifiquei o código para trabalhar com
.NET CORE 3 e Swagger V5
fonte
Acabei de fazer isso e funciona bem!
Startup.cs
Model.cs
swagger.json
Espero que isso ajude você como me ajudou!
fonte
DescribeAllEnumsAsStrings
está obsoletofonte
Minha variante para enum stings com valores:
Configure os serviços:
Filtro:
fonte
escrever código dentro de Startup.cs
fonte
Eu encontrei uma boa solução alternativa aqui:
@PauloVetor - resolveu usando ShemaFilter assim:
E em Startup.cs:
fonte
model.Format
para"string"
como geralmente será"int32"
..Net Core 3.0
fonte
Modifiquei a resposta de Hosam Rehani para trabalhar com enums anuláveis e com coleção de enums também. A resposta anterior também funciona apenas se uma propriedade for nomeada exatamente como seu tipo. Todos esses problemas são tratados no código a seguir.
Funciona com .net core 3.xe swagger 5.x.
poderia ser mais eficiente não pesquisando o tipo de enum duas vezes em alguns casos.
para usar o filtro, adicione
c.DocumentFilter<SwaggerAddEnumDescriptions>();
à configuração swagger emStartup.cs
.fonte
SOLUÇÃO ASP NET
Em meus documentos de API, um enum ainda era mostrado como int, apesar de a propriedade estar marcada com
StringEnumConverter
. Não podíamos nos dar ao luxo de usar a configuração global para todos os enums mencionados acima. Adicionar esta linha no SwaggerConfig resolveu o problema:fonte
Encontrei uma série de deficiências nas outras respostas para o que estávamos procurando, então pensei em fornecer minha própria opinião sobre isso. Estamos usando ASP.NET Core 3.1 com System.Text.Json, mas nossa abordagem funciona independentemente do serializador JSON usado.
Nosso objetivo era aceitar valores de string enum com letras maiúsculas e minúsculas na API ASP.NET Core, bem como documentar os mesmos no Swagger. No momento, estamos usando
[DataContract]
e[EnumMember]
, portanto, a abordagem é pegar o valor de caixa baixa do camelo da propriedade de valor EnumMember e usá-lo em toda a linha.Nosso exemplo de enum:
Usaremos os valores EnumMember no Swashbuckle usando um ISchemaFilter como a seguir:
Nós estamos usando um pacote NuGet de terceiros (GitHub repo ) para garantir que este esquema de nomenclatura também é utilizada em ASP.NET Core. Configure-o em Startup.cs em ConfigureServices com:
Finalmente, precisamos registrar nosso ISchemaFilter no Swashbuckle, então também adicionar o seguinte também em ConfigureServices ():
fonte
GetMembers()
seria melhorGetMembers(BindingFlags.Static | BindingFlags.Public)
limitar apenas às propriedades reais de enum declaradas, como "Azul". Eu também adaptei o caso "else" para retornar o Member.Name se não houver nenhum[EnumMember]
atributo.Isso não é possível com o OpenAPI padrão. Enums são descritos apenas com seus valores de string.
Felizmente, você pode fazer isso com algumas extensões não padronizadas que são utilizadas por seu gerador de cliente.
Suporta NSwag
x-enumNames
Suporta AutoRest
x-ms-enum
.Suporta gerador Openapi
x-enum-varnames
Outros geradores podem suportar uma dessas extensões ou ter as suas próprias.
Para gerar
x-enumNames
para NSwag, crie o seguinte filtro de esquema:E registre-o como:
fonte
Se a versão do swagger era 5.5.x, você precisa:
instalar: Install-Package Swashbuckle.AspNetCore.Newtonsoft -Version 5.5.0
services.AddSwaggerGenNewtonsoftSupport ();
Referência: https://github.com/domaindrivendev/Swashbuckle.AspNetCore#systemtextjson-stj-vs-newtonsoft
fonte