Czy istnieje sposób na wyświetlenie wszystkich wyliczeń jako wartości ciągu w swagger zamiast ich wartości int?
Chcę mieć możliwość przesyłania działań POST i umieszczania wyliczeń zgodnie z ich wartością ciągu bez konieczności przeglądania wyliczenia za każdym razem.
Próbowałem, DescribeAllEnumsAsStrings
ale serwer otrzymuje ciągi znaków zamiast wartości wyliczenia, czego nie szukamy.
Czy ktoś to rozwiązał?
Edytować:
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
}
Odpowiedzi:
Z dokumentów :
Ponadto, jeśli chcesz, aby to zachowanie dotyczyło tylko określonego typu i właściwości, użyj StringEnumConverter:
źródło
DescribeAllEnumsAsStrings
pracował dla właściwości obiektów, a nawet parametrów zapytań dotyczących akcji kontrolera. Jednak używanieEnumDataTypeAttribute
iJsonConverter(typeof(StringEnumConverter))
nie działa dla mnie.Dla ASP.NET Core 3 z biblioteką Microsoft JSON (System.Text.Json)
W Startup.cs / ConfigureServices ():
W przypadku ASP.NET Core 3 z biblioteką Json.NET (Newtonsoft.Json)
Zainstaluj
Swashbuckle.AspNetCore.Newtonsoft
pakiet.W Startup.cs / ConfigureServices ():
W przypadku ASP.NET Core 2
W Startup.cs / ConfigureServices ():
Pre-ASP.NET Core
źródło
AzureExtensions.Swashbuckle
ale podobnie jak @DanFriedman nie mogę sprawić, aby enum-to-string działało zgodnie z oczekiwaniamiMyślę więc, że mam podobny problem. Szukam swaggera do generowania wyliczeń wraz z mapowaniem ciągów int ->. Interfejs API musi akceptować int. Swagger-ui ma mniejsze znaczenie, to, czego naprawdę chcę, to generowanie kodu z "prawdziwym" wyliczeniem po drugiej stronie (aplikacje na Androida używające w tym przypadku retrofitu).
Z moich badań wynika, że ostatecznie wydaje się, że jest to ograniczenie specyfikacji OpenAPI, której używa Swagger. Nie można określić nazw ani numerów wyliczeń.
Najlepszym problemem, jaki znalazłem, jest https://github.com/OAI/OpenAPI-Specification/issues/681, który wygląda na „może wkrótce”, ale wtedy Swagger musiałby zostać zaktualizowany, aw moim przypadku Swashbuckle jako dobrze.
Na razie moim obejściem było zaimplementowanie filtru dokumentu, który wyszukuje wyliczenia i wypełnia odpowiedni opis zawartością wyliczenia.
SwaggerAddEnumDescriptions.cs:
Skutkuje to czymś podobnym do następującego w twoim swagger-ui, więc przynajmniej możesz „zobaczyć, co robisz”:
źródło
ASP.NET Core 3.1
Aby wygenerować wyliczenia jako ciągi przy użyciu Newtonsoft JSON, należy jawnie dodać obsługę Newtonsoft, dodając
AddSwaggerGenNewtonsoftSupport()
następujące elementy:Funkcja ta jest dostępna za pośrednictwem nowego pakietu
Swashbuckle.AspNetCore.Newtonsoft
. Wygląda na to, że wszystko inne działa dobrze bez tego pakietu, z wyjątkiem obsługi konwertera wyliczeń.źródło
StringEnumConverter
jako przypadek specjalny.Chciałem użyć odpowiedzi rory_za w aplikacji .NET Core, ale musiałem ją nieco zmodyfikować, aby działała. Oto implementacja, którą wymyśliłem dla .NET Core.
Zmieniłem go również, aby nie zakładał, że typ bazowy to
int
, i używam nowych linii między wartościami, aby ułatwić czytanie.Następnie dodaj to do swojej
ConfigureServices
metody w Startup.cs:źródło
DescribeEnumParameters
w moim projekcie były puste. Musiałem rzucićparam
doNonBodyParameter
i sprawdzić tam enum:if (param is NonBodyParameter nbParam && nbParam.Enum?.Any() == true) { param.Description += DescribeEnum(nbParam.Enum); }
Z asp.net core 3
Wygląda jednak na to, że Swashbuckle w wersji 5.0.0-rc4 nie jest na to gotowy. Musimy więc użyć opcji (przestarzałej) w pliku konfiguracyjnym Swashbuckle, dopóki nie będzie obsługiwać i odzwierciedlać ją jak bibliotekę Newtonsoft.
Różnica między tą odpowiedzią a innymi odpowiedziami polega na używaniu tylko biblioteki Microsoft JSON zamiast Newtonsoft.
źródło
NET CORE 3.1 i SWAGGER 5
jeśli potrzebujesz prostego rozwiązania do selektywnego tworzenia wyliczeń przekazywanych jako ciągi:
Uwaga, używamy
System.Text.Json.Serialization
przestrzeni nazw, a nieNewtonsoft.Json
!źródło
System.Text.Json
.DescribeAllEnumsAsStrings
przekonwertuje wszystkie wyliczenia na ciąg.jeśli ktoś jest zainteresowany, zmodyfikowałem kod do pracy
.NET CORE 3 i Swagger V5
źródło
Właśnie to zrobiłem i działa dobrze!
Startup.cs
Model.cs
swagger.json
Mam nadzieję, że pomogło ci to, jak mi pomogło!
źródło
DescribeAllEnumsAsStrings
jest przestarzałyźródło
Mój wariant dla wyliczenia żądeł z wartościami:
Skonfiguruj usługi:
Filtr:
źródło
napisz kod wewnątrz Startup.cs
źródło
Znalazłem fajne obejście tutaj:
@PauloVetor - rozwiązałem to za pomocą ShemaFilter w ten sposób:
A w Startup.cs:
źródło
model.Format
do"string"
tak, jak zwykle"int32"
..Net Core 3.0
źródło
Zmodyfikowałem odpowiedź Hosam Rehani, aby działała z wyliczeniami zerowalnymi, a także z kolekcją wyliczeń. Poprzednia odpowiedź działa również tylko wtedy, gdy właściwość jest nazwana dokładnie tak, jak jej typ. Wszystkie te problemy są opisane w poniższym kodzie.
Działa z .net core 3.x i swagger 5.x.
w niektórych przypadkach może być bardziej wydajne, jeśli nie wyszukuje się typu wyliczenia dwukrotnie.
aby użyć filtra dodaj
c.DocumentFilter<SwaggerAddEnumDescriptions>();
do konfiguracji swagger wStartup.cs
.źródło
ROZWIĄZANIE ASP NET
W moich dokumentach API jedno wyliczenie było nadal wyświetlane jako int, mimo że właściwość została oznaczona
StringEnumConverter
. Nie mogliśmy sobie pozwolić na używanie ustawienia globalnego dla wszystkich wymienionych powyżej wyliczeń. Dodanie tej linii w SwaggerConfig rozwiązało problem:źródło
Było wiele niedociągnięć, które znalazłem w innych odpowiedziach na to, czego szukaliśmy, więc pomyślałem, że przedstawię własne podejście. Używamy ASP.NET Core 3.1 z System.Text.Json, ale nasze podejście działa niezależnie od używanego serializatora JSON.
Naszym celem było zaakceptowanie wartości ciągów wyliczeniowych z małymi wielbłądami w obu ASP.NET Core API, a także udokumentowanie tego samego w Swagger. Obecnie korzystamy z
[DataContract]
i[EnumMember]
, więc podejście polega na przejęciu mniejszej wartości wielkości wielbłąda z właściwości wartości EnumMember i zastosowaniu jej we wszystkich kategoriach.Nasze przykładowe wyliczenie:
Użyjemy wartości EnumMember w Swashbuckle przy użyciu ISchemaFilter, jak w poniższym przykładzie:
Używamy pakietu NuGet innej firmy ( repozytorium GitHub ), aby upewnić się, że ten schemat nazewnictwa jest również używany w ASP.NET Core. Skonfiguruj go w Startup.cs w ConfigureServices za pomocą:
Na koniec musimy zarejestrować nasz ISchemaFilter w Swashbuckle, więc dodaj również następujące elementy w ConfigureServices ():
źródło
GetMembers()
byłoby lepiejGetMembers(BindingFlags.Static | BindingFlags.Public)
ograniczyć się tylko do faktycznie zadeklarowanych właściwości wyliczenia, takich jak „Niebieski”. Dostosowałem również przypadek „else”, aby zwracał element Member.Name, jeśli nie ma[EnumMember]
atrybutu.Nie jest to możliwe w przypadku standardowego OpenAPI. Wyliczenia są opisywane tylko za pomocą wartości łańcuchowych.
Na szczęście możesz to zrobić za pomocą niestandardowych rozszerzeń, które są używane przez generator klientów.
NSwag obsługuje
x-enumNames
Obsługuje AutoRest
x-ms-enum
.Obsługuje Openapi-generator
x-enum-varnames
Inne generatory mogą obsługiwać jedno z tych rozszerzeń lub mieć własne.
Aby wygenerować
x-enumNames
dla NSwag, utwórz następujący filtr schematu:I zarejestruj to jako:
źródło
Jeśli wersja swaggera była 5.5.x, musisz:
instalacja: Install-Package Swashbuckle.AspNetCore.Newtonsoft -Version 5.5.0
services.AddSwaggerGenNewtonsoftSupport ();
Źródła: https://github.com/domaindrivendev/Swashbuckle.AspNetCore#systemtextjson-stj-vs-newtonsoft
źródło