2016-04-06 41 views
20

C'è un modo per visualizzare tutte le enumerazioni come valore di stringa in swagger invece del loro valore int?Swagger UI Web Documentazione Api Presenta enumerazioni come stringhe?

Voglio essere in grado di inviare azioni POST e inserire le enumerazioni in base al loro valore di stringa senza dover guardare l'enumerazione ogni volta.

Ho provato DescribeAllEnumsAsStrings ma il server riceve quindi le stringhe invece del valore enum che non è quello che stiamo cercando.

Qualcuno ha risolto questo?

Edit:

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 
} 
+1

Do vuoi che lo schema descriva il valore come una stringa, ma poi pubblica un intero sul server? JSON.net gestirà entrambi i valori, quindi la versione solo intera è un requisito definito? Non penso che Swagger supporti un tipo di enum con valore sia di stringa sia di intero. – Mig

+1

Il tuo comportamento previsto non è chiaro, puoi spiegare meglio cosa vuoi visualizzare l'interfaccia utente di Swagger e cosa vuoi POST/PUT con la tua API Web con esempi? –

+0

Mig è esattamente quello che volevo. Quando viene inviato al mio server non riuscendo a convalidare il numero intero, forse il problema è all'interno del mio codice. Ma tu dici che nel mio database, verrà salvato come intero? O sarà salvato come intero? Sarà uno spreco salvarlo come stringa sul mio database –

risposta

59

Da the docs:

httpConfiguration 
    .EnableSwagger(c => 
     { 
      c.SingleApiVersion("v1", "A title for your API"); 

      c.DescribeAllEnumsAsStrings(); // this will do the trick 
     }); 

Inoltre, se si desidera che questo comportamento solo su un particolare tipo e proprietà, utilizzare lo StringEnumConverter:

public class Letter 
{ 
    [Required] 
    public string Content {get; set;} 

    [Required] 
    [EnumDataType(typeof(Priority))] 
    [JsonConverter(typeof(StringEnumConverter))] 
    public Priority Priority {get; set;} 
} 
+4

Questa risposta dovrebbe ottenere il segno di spunta della soluzione. – sprinter252

+0

questo non funziona per me. [EnumDataType (typeof (Priorità))] [JsonConverter (typeof (StringEnumConverter))] – Lineker

+0

Questo è pulito grazie –

14

Così Penso di avere un problema simile. Sto cercando swagger per generare enum insieme con int -> mapping delle stringhe. L'API deve accettare l'int. Lo swagger-ui conta di meno, quello che voglio veramente è la generazione del codice con un enum "vero" sull'altro lato (le app Android che usano il retrofit in questo caso).

Quindi dalla mia ricerca questo alla fine sembra essere un limite delle specifiche OpenAPI utilizzate da Swagger. Non è possibile specificare nomi e numeri per le enumerazioni.

Il problema migliore che ho trovato è https://github.com/OAI/OpenAPI-Specification/issues/681 che sembra un "forse presto", ma Swagger dovrebbe essere aggiornato, e nel mio caso anche Swashbuckle.

Per ora la mia soluzione è stata quella di implementare un filtro di documento che cerca enumerazioni e popola la descrizione pertinente con il contenuto dell'enumerazione.

 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 = [email protected]; 
       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 = [email protected]; 
       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()); 
    } 

} 

Questo traduce in qualcosa di simile al seguente sul spavalderia-ui così almeno si possono "vedere quello che stai facendo": enter image description here

+0

+1 Stavo cercando di aggiungere descrizioni alle enumerazioni (solo per 'descrivere enum'), non ho mai pensato a questo. Ho già installato vari filtri, ma cercavo qualcosa di più "organico", ma non c'è supporto. Bene allora, filtri fino in fondo :) – NSGaga