2016-04-06 14 views
20

Czy istnieje sposób wyświetlania wszystkich wyliczeń jako ich wartości łańcuchowej w swaggerze zamiast ich wartości int?Dokumentacja Swagger UI w sieci Web Api Obecne wyliczenia jako ciągi znaków?

Chcę móc przesyłać akcje POST i umieszczać wyliczenia zgodnie z ich wartością ciągów bez konieczności przeglądania enum za każdym razem.

Próbowałem DescribeAllEnumsAsStrings, ale serwer następnie otrzymuje ciągi zamiast wartości wyliczeniowej, która nie jest tym, czego szukamy.

Czy ktoś to rozwiązał?

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 chcesz, aby schemat opisał wartość jako ciąg, a następnie opublikował liczbę całkowitą na serwerze? JSON.net poradzi sobie z obydwoma wartościami, więc czy jest to tylko wersja całkowita? Nie sądzę, że Swagger obsługuje typ wyliczeniowy z wartością ciągu i liczby całkowitej. – Mig

+1

Twoje oczekiwane zachowanie jest niejasne, czy możesz lepiej wyjaśnić, co chcesz, aby Swagger UI wyświetlał i co chcesz POST/PUT do swojego Web API z przykładami? –

+0

Mig to dokładnie to, czego chciałem. Kiedy jest on wysyłany do mojego serwera, ponieważ walidacja nie powiedzie się, być może problem jest w moim kodzie. Ale mówisz, że w mojej bazie danych będzie ona zapisana jako liczba całkowita? Czy będzie zapisany jako liczba całkowita? Będzie marnotrawstwem, aby zapisać go jako ciąg w mojej bazie danych –

Odpowiedz

59

Od the docs:

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

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

Ponadto, jeśli chcesz to zachowanie tylko na określonym rodzaju i właściwości, użyj StringEnumConverter:

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

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

Ta odpowiedź powinna otrzymać znacznik wyboru rozwiązania. – sprinter252

+0

to nie działa dla mnie. [EnumDataType (typeof (Priority))] [JsonConverter (typeof (StringEnumConverter))] – Lineker

+0

to czyste dziękuję –

14

Tak Myślę, że mam podobny problem. Szukam swagger do generowania wyliczeń wraz z mapowaniem int -> string. Interfejs API musi akceptować int. Swagger-ui ma mniejsze znaczenie, czego naprawdę potrzebuję, to generowanie kodu z "prawdziwym" wyliczeniem po drugiej stronie (aplikacje z Androidem używające w tym przypadku modernizacji).

Tak więc z moich badań wynika, że ​​ostatecznie jest to limit specyfikacji OpenAPI, której używa Swagger. Nie można podać nazw i liczb dla wyliczeń.

Najlepszym problemem, jaki znalazłem, jest https://github.com/OAI/OpenAPI-Specification/issues/681, który wygląda jak "może wkrótce", ale wtedy Swagger musiał zostać zaktualizowany, aw moim przypadku także Swashbuckle.

Na razie moje obejście polegało na wdrożeniu filtru dokumentów, który wyszukuje wyliczenia i wypełnia odpowiedni opis treścią wyliczenia.

 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()); 
    } 

} 

Powoduje to coś jak następuje na Swagger-ui tak przynajmniej można "zobaczyć, co robisz": enter image description here

+0

+1 Chciałbym dodać opisy do wyliczenia (po prostu "opisać enum"), nigdy nie myślałem o tym. Mam już filtry misc w miejscu, ale szukałem czegoś bardziej "organicznego", ale nie ma wsparcia. No cóż, filtry cały czas :) – NSGaga

Powiązane problemy