Existe-t-il un moyen d'afficher toutes les énumérations en tant que valeur de chaîne dans swagger au lieu de leur valeur int?
Je veux pouvoir soumettre des actions POST et mettre des énumérations en fonction de leur valeur de chaîne sans avoir à regarder l'énumération à chaque fois.
J'ai essayé DescribeAllEnumsAsStrings
mais le serveur reçoit alors des chaînes au lieu de la valeur enum qui n'est pas ce que nous recherchons.
Quelqu'un a-t-il résolu cela?
Éditer:
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
}
Réponses:
À partir de la documentation :
De plus, si vous souhaitez ce comportement uniquement sur un type et une propriété particuliers, utilisez StringEnumConverter:
la source
DescribeAllEnumsAsStrings
travaillé pour les propriétés des objets et même les paramètres de requête sur les actions du contrôleur. Cependant, utiliserEnumDataTypeAttribute
etJsonConverter(typeof(StringEnumConverter))
n'a pas fonctionné pour moi.Pour ASP.NET Core 3 avec la bibliothèque Microsoft JSON (System.Text.Json)
Dans Startup.cs / ConfigureServices ():
Pour ASP.NET Core 3 avec la bibliothèque Json.NET (Newtonsoft.Json)
Installez le
Swashbuckle.AspNetCore.Newtonsoft
package.Dans Startup.cs / ConfigureServices ():
Pour ASP.NET Core 2
Dans Startup.cs / ConfigureServices ():
Pre-ASP.NET Core
la source
AzureExtensions.Swashbuckle
package, mais comme @DanFriedman, je ne peux pas faire fonctionner l'énumération à la chaîne comme prévuJe pense donc que j'ai un problème similaire. Je recherche swagger pour générer des énumérations avec le mappage int -> string. L'API doit accepter l'int. Le swagger-ui importe moins, ce que je veux vraiment, c'est la génération de code avec une "vraie" énumération de l'autre côté (applications Android utilisant la modernisation dans ce cas).
Donc, d'après mes recherches, cela semble finalement être une limite de la spécification OpenAPI que Swagger utilise. Il n'est pas possible de spécifier des noms et des numéros pour les énumérations.
Le meilleur problème que j'ai trouvé à suivre est https://github.com/OAI/OpenAPI-Specification/issues/681 qui ressemble à un "peut-être bientôt" mais alors Swagger devrait être mis à jour, et dans mon cas Swashbuckle comme bien.
Pour l'instant, ma solution de contournement a été d'implémenter un filtre de document qui recherche les énumérations et remplit la description appropriée avec le contenu de l'énumération.
SwaggerAddEnumDescriptions.cs:
Il en résulte quelque chose comme ce qui suit sur votre swagger-ui afin qu'au moins vous puissiez "voir ce que vous faites":
la source
ASP.NET Core 3.1
Pour générer des énumérations sous forme de chaînes à l'aide de Newtonsoft JSON, vous devez explicitement ajouter la prise en charge de Newtonsoft en ajoutant
AddSwaggerGenNewtonsoftSupport()
comme suit:Il est disponible via un nouveau package,
Swashbuckle.AspNetCore.Newtonsoft
. Il semble que tout le reste fonctionne correctement sans ce package, à l'exception de la prise en charge du convertisseur enum.la source
StringEnumConverter
comme un cas particulier.Je voulais utiliser la réponse de rory_za dans une application .NET Core, mais j'ai dû la modifier un peu pour qu'elle fonctionne. Voici l'implémentation que j'ai proposée pour .NET Core.
Je l'ai également changé pour ne pas supposer que le type sous-jacent est
int
et utiliser de nouvelles lignes entre les valeurs pour une lecture plus facile.Ajoutez ensuite ceci à votre
ConfigureServices
méthode dans Startup.cs:la source
DescribeEnumParameters
étaient vides dans mon projet. J'ai dû lancer leparam
toNonBodyParameter
et vérifier l'énumération là-bas:if (param is NonBodyParameter nbParam && nbParam.Enum?.Any() == true) { param.Description += DescribeEnum(nbParam.Enum); }
Avec asp.net core 3
Mais il semble que Swashbuckle version 5.0.0-rc4 ne soit pas prêt à prendre en charge cela. Nous devons donc utiliser une option (obsolète) dans le fichier de configuration Swashbuckle jusqu'à ce qu'elle le prenne en charge et le reflète comme la bibliothèque Newtonsoft.
La différence entre cette réponse et d'autres réponses consiste à utiliser uniquement la bibliothèque Microsoft JSON au lieu de Newtonsoft.
la source
.NET CORE 3.1 et SWAGGER 5
si vous avez besoin d'une solution simple pour rendre sélectivement les énumérations passées sous forme de chaînes:
Notez que nous utilisons l'
System.Text.Json.Serialization
espace de noms, pas leNewtonsoft.Json
!la source
System.Text.Json
.DescribeAllEnumsAsStrings
je vais convertir toutes les énumérations en chaîne.si quelqu'un est intéressé, j'ai modifié le code pour travailler avec
.NET CORE 3 et Swagger V5
la source
Je viens de faire ça et ça marche bien!
Startup.cs
Model.cs
swagger.json
J'espère que cela vous aidera comment cela m'a aidé!
la source
DescribeAllEnumsAsStrings
est obsolètela source
Ma variante pour les enum stings avec des valeurs:
Configurer les services:
Filtre:
la source
écrire du code dans Startup.cs
la source
J'ai trouvé une bonne solution de contournement ici:
@PauloVetor - l'a résolu en utilisant ShemaFilter comme ceci:
Et dans Startup.cs:
la source
model.Format
à jour le vers"string"
tel qu'il sera généralement"int32"
..Net Core 3.0
la source
J'ai modifié la réponse de Hosam Rehani pour qu'elle fonctionne avec des énumérations nullables et avec une collection d'énumérations également. La réponse précédente ne fonctionne également que si une propriété est nommée exactement comme son type. Tous ces problèmes sont traités dans le code ci-dessous.
Il fonctionne avec .net core 3.x et swagger 5.x.
il pourrait être plus efficace de ne pas rechercher le type enum deux fois dans certains cas.
pour utiliser le filtre ajouter
c.DocumentFilter<SwaggerAddEnumDescriptions>();
à la configuration swagger dansStartup.cs
.la source
SOLUTION ASP NET
Dans mes documents API, un enum était toujours affiché comme int malgré le marquage de la propriété
StringEnumConverter
. Nous ne pouvions pas nous permettre d'utiliser le paramètre global pour toutes les énumérations mentionnées ci-dessus. L'ajout de cette ligne dans SwaggerConfig a résolu le problème:la source
Il y avait un certain nombre de lacunes que j'ai trouvées dans les autres réponses pour ce que nous recherchions, alors j'ai pensé que je fournirais ma propre opinion à ce sujet. Nous utilisons ASP.NET Core 3.1 avec System.Text.Json, mais notre approche fonctionne quel que soit le sérialiseur JSON utilisé.
Notre objectif était d'accepter les valeurs de chaîne d'énumération à casse inférieure dans l'API ASP.NET Core et de documenter la même chose dans Swagger. Nous utilisons actuellement
[DataContract]
et[EnumMember]
, donc l'approche consiste à prendre la valeur inférieure de la casse de chameau de la propriété de valeur EnumMember et à l'utiliser dans tous les domaines.Notre exemple d'énumération:
Nous utiliserons les valeurs EnumMember dans Swashbuckle en utilisant un ISchemaFilter comme dans l'exemple suivant:
Nous utilisons un package NuGet tiers (GitHub repo pour faire en sorte que ce système de nommage est également utilisé dans ASP.NET de base). Configurez-le dans Startup.cs dans ConfigureServices avec:
Enfin, nous devons enregistrer notre ISchemaFilter dans Swashbuckle, alors ajoutez également ce qui suit dans ConfigureServices ():
la source
GetMembers()
serait préférable deGetMembers(BindingFlags.Static | BindingFlags.Public)
se limiter aux seules propriétés d'énumération déclarées telles que "Blue". J'ai également adapté le cas "else" pour renvoyer le Member.Name s'il n'y a pas d'[EnumMember]
attribut.Cela n'est pas possible avec OpenAPI standard. Les énumérations sont décrites uniquement avec leurs valeurs de chaîne.
Heureusement, vous pouvez le faire avec certaines extensions non standard qui sont utilisées par votre générateur client.
NSwag prend en charge
x-enumNames
AutoRest prend en charge
x-ms-enum
.Prise en charge d'Openapi-Generator
x-enum-varnames
D'autres générateurs peuvent prendre en charge l'une de ces extensions ou posséder la leur.
Pour générer
x-enumNames
pour NSwag, créez le filtre de schéma suivant:Et enregistrez-le comme:
la source
Si la version du swagger était 5.5.x, vous devez:
installer: Install-Package Swashbuckle.AspNetCore.Newtonsoft -Version 5.5.0
services.AddSwaggerGenNewtonsoftSupport ();
Référence: https://github.com/domaindrivendev/Swashbuckle.AspNetCore#systemtextjson-stj-vs-newtonsoft
la source