Gibt es eine Möglichkeit, alle Aufzählungen als Zeichenfolgenwert in swagger anstelle ihres int-Werts anzuzeigen?
Ich möchte in der Lage sein, POST-Aktionen einzureichen und Aufzählungen entsprechend ihrem Zeichenfolgenwert zu setzen, ohne jedes Mal die Aufzählung überprüfen zu müssen.
Ich habe es versucht, DescribeAllEnumsAsStrings
aber der Server empfängt dann Zeichenfolgen anstelle des Aufzählungswerts, nach dem wir nicht suchen.
Hat jemand das gelöst?
Bearbeiten:
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
}
Antworten:
Aus den Dokumenten :
Wenn Sie dieses Verhalten nur für einen bestimmten Typ und eine bestimmte Eigenschaft wünschen, verwenden Sie den StringEnumConverter:
quelle
DescribeAllEnumsAsStrings
arbeitete für Objekteigenschaften und sogar für Abfrageparameter für Controller-Aktionen. Allerdings mitEnumDataTypeAttribute
undJsonConverter(typeof(StringEnumConverter))
hat bei mir nicht funktioniert.Für ASP.Net Core 3 mit Newtonsoft JSON-Bibliothek
Swashbuckle.AspNetCore.Newtonsoft
Paket installieren .Dann in Startup.cs / ConfigureServices ():
Dies erfordert keinen Aufruf von
options.DescribeAllEnumsAsStrings()
AddSwaggerGen ().Für ASP.Net Core 3 mit Microsoft JSON-Bibliothek
Siehe @ Bashirs Antwort im Grunde:
Und wie er beschreibt, erfordert es derzeit
options.DescribeAllEnumsAsStrings()
.Für ASP.Net Core 2
In Startup.cs / ConfigureServices ():
Dies erfordert keinen Aufruf von
options.DescribeAllEnumsAsStrings()
AddSwaggerGen ().Pre ASP.Net Core
Verwenden Sie den
DescribeAllEnumsAsStrings()
Ansatz aus der akzeptierten Antwort.quelle
services.AddSwaggerGenNewtonsoftSupport();
undSwashbuckle.AspNetCore.Newtonsoft
Nuget-PaketAddSwaggerGenNewtonsoftSupport()
genannt werden muss , nachAddSwaggerGen
oder es wird nicht funktionieren.Ich glaube, ich habe ein ähnliches Problem. Ich suche nach Prahlerei, um Enums zusammen mit der int -> String-Zuordnung zu generieren. Die API muss den int akzeptieren. Die Prahlerei-UI ist weniger wichtig. Was ich wirklich will, ist die Codegenerierung mit einer "echten" Aufzählung auf der anderen Seite (in diesem Fall Android-Apps mit Nachrüstung).
Aus meiner Forschung scheint dies letztendlich eine Grenze der OpenAPI-Spezifikation zu sein, die Swagger verwendet. Es ist nicht möglich, Namen und Nummern für Aufzählungen anzugeben.
Das beste Problem, das ich gefunden habe, ist https://github.com/OAI/OpenAPI-Specification/issues/681, das wie "vielleicht bald" aussieht, aber dann müsste Swagger aktualisiert werden, und in meinem Fall Swashbuckle als Gut.
Im Moment bestand meine Problemumgehung darin, einen Dokumentfilter zu implementieren, der nach Aufzählungen sucht und die entsprechende Beschreibung mit dem Inhalt der Aufzählung füllt.
SwaggerAddEnumDescriptions.cs:
Dies führt auf Ihrer Swagger-Benutzeroberfläche zu folgenden Ergebnissen, sodass Sie zumindest "sehen können, was Sie tun":
quelle
ASP.NET Core 3.1
Um mit Newtonsoft JSON Aufzählungen als Zeichenfolgen zu generieren, müssen Sie die Newtonsoft-Unterstützung explizit hinzufügen, indem Sie
AddSwaggerGenNewtonsoftSupport()
Folgendes hinzufügen :Dies ist über ein neues Paket möglich
Swashbuckle.AspNetCore.Newtonsoft
. Es sieht so aus, als ob alles andere ohne dieses Paket gut funktioniert, abgesehen von der Unterstützung von Enum Converter.quelle
StringEnumConverter
als Sonderfall.Ich wollte die Antwort von rory_za in einer .NET Core-Anwendung verwenden, musste sie jedoch ein wenig ändern, damit sie funktioniert. Hier ist die Implementierung, die ich für .NET Core entwickelt habe.
Ich habe es auch geändert, damit nicht angenommen wird
int
, dass es sich um den zugrunde liegenden Typ handelt , und neue Zeilen zwischen den Werten verwendet, um das Lesen zu erleichtern.Fügen Sie dies dann Ihrer
ConfigureServices
Methode in Startup.cs hinzu:quelle
DescribeEnumParameters
waren in meinem Projekt leer. Ich musste dasparam
zuNonBodyParameter
besetzen und die Aufzählung dort überprüfen:if (param is NonBodyParameter nbParam && nbParam.Enum?.Any() == true) { param.Description += DescribeEnum(nbParam.Enum); }
Mit asp.net Kern 3
Aber es scheint, dass Swashbuckle Version 5.0.0-rc4 nicht bereit ist, dies zu unterstützen. Daher müssen wir eine Option (veraltet) in der Swashbuckle-Konfigurationsdatei verwenden, bis sie wie die Newtonsoft-Bibliothek unterstützt und wiedergegeben wird.
Der Unterschied zwischen dieser Antwort und anderen Antworten besteht darin, dass nur die Microsoft JSON-Bibliothek anstelle von Newtonsoft verwendet wird.
quelle
.NET CORE 3.1 und SWAGGER 5
Wenn Sie eine einfache Lösung benötigen, um selektiv als Zeichenfolgen übergebene Aufzählungen zu erstellen:
Beachten Sie, dass wir den
System.Text.Json.Serialization
Namespace verwenden, nicht denNewtonsoft.Json
!quelle
System.Text.Json
.DescribeAllEnumsAsStrings
alle Aufzählungen in den String konvertieren werde.Wenn jemand interessiert ist, habe ich den Code geändert, um damit zu arbeiten
.NET CORE 3 und Swagger V5
quelle
Ich habe das gerade gemacht und es funktioniert gut!
Startup.cs
Model.cs
swagger.json
Ich hoffe das hilft dir wie es mir geholfen hat!
quelle
DescribeAllEnumsAsStrings
ist veraltetquelle
Meine Variante für Enum Stings mit Werten:
Dienste konfigurieren:
Filter:
quelle
Schreiben Sie Code in Startup.cs
quelle
.Net Core 3.0
quelle
Ich habe hier eine gute Lösung gefunden:
@PauloVetor - löste es mit ShemaFilter wie folgt:
Und in Startup.cs:
quelle
model.Format
,"string"
wie es im Allgemeinen sein wird"int32"
.Ich habe Hosam Rehanis Antwort geändert, um mit nullbaren Aufzählungen und auch mit der Sammlung von Aufzählungen zu arbeiten. Die vorherige Antwort funktioniert auch nur, wenn eine Eigenschaft genau wie ihr Typ benannt ist. All diese Probleme werden im folgenden Code behandelt.
Es funktioniert mit .net Core 3.x und Swagger 5.x.
Es könnte effizienter sein, wenn in einigen Fällen nicht zweimal nach dem Aufzählungstyp gesucht wird.
Um den Filter zu verwenden, fügen Sie
c.DocumentFilter<SwaggerAddEnumDescriptions>();
die Swagger-Konfiguration hinzuStartup.cs
.quelle
ASP-NETZLÖSUNG
In meinen API-Dokumenten wurde eine Aufzählung immer noch als int angezeigt, obwohl die Eigenschaft mit markiert ist
StringEnumConverter
. Wir konnten es uns nicht leisten, die globale Einstellung für alle oben genannten Aufzählungen zu verwenden. Das Hinzufügen dieser Zeile in SwaggerConfig löste das Problem:quelle
Es gab eine Reihe von Mängeln, die ich in den anderen Antworten für das gefunden habe, wonach wir gesucht haben, also dachte ich, ich würde meine eigene Meinung dazu abgeben. Wir verwenden ASP.NET Core 3.1 mit System.Text.Json, aber unser Ansatz funktioniert unabhängig vom verwendeten JSON-Serializer.
Unser Ziel war es, Enum-String-Werte mit niedrigerer Kamelhülle sowohl in der ASP.NET Core-API als auch in Swagger zu dokumentieren. Wir verwenden derzeit
[DataContract]
und[EnumMember]
, daher besteht der Ansatz darin, den Wert mit niedrigerer Kamelhülle aus der EnumMember-Werteigenschaft zu übernehmen und auf der ganzen Linie zu verwenden.Unsere Beispielaufzählung:
Wir werden die EnumMember-Werte in Swashbuckle verwenden, indem wir einen ISchemaFilter wie folgt verwenden:
Wir verwenden ein NuGet-Paket eines Drittanbieters (GitHub- Repo ), um sicherzustellen, dass dieses Namensschema auch in ASP.NET Core verwendet wird. Konfigurieren Sie es in Startup.cs in ConfigureServices mit:
Schließlich müssen wir unseren ISchemaFilter in Swashbuckle registrieren, also fügen Sie auch in ConfigureServices () Folgendes hinzu:
quelle
GetMembers()
Es wäre besserGetMembers(BindingFlags.Static | BindingFlags.Public)
, sich nur auf die tatsächlich deklarierten Enum-Eigenschaften wie "Blau" zu beschränken. Ich habe auch den Fall "else" angepasst, um den Member.Name zurückzugeben, wenn kein[EnumMember]
Attribut vorhanden ist.Dies ist mit Standard-OpenAPI nicht möglich. Aufzählungen werden nur mit ihren Zeichenfolgenwerten beschrieben.
Glücklicherweise können Sie dies mit einigen nicht standardmäßigen Erweiterungen tun, die von Ihrem Client-Generator verwendet werden.
NSwag unterstützt
x-enumNames
AutoRest unterstützt
x-ms-enum
.Openapi-Generator unterstützt
x-enum-varnames
Andere Generatoren unterstützen möglicherweise eine dieser Erweiterungen oder haben ihre eigene.
Um
x-enumNames
für NSwag zu generieren, erstellen Sie den folgenden Schemafilter:Und registrieren Sie es als:
quelle
Wenn die Version der Prahlerei 5.5.x war, müssen Sie:
install: Install-Package Swashbuckle.AspNetCore.Newtonsoft -Version 5.5.0
services.AddSwaggerGenNewtonsoftSupport ();
Referenz: https://github.com/domaindrivendev/Swashbuckle.AspNetCore#systemtextjson-stj-vs-newtonsoft
quelle