Apakah ada cara untuk menampilkan semua enum sebagai nilai stringnya dalam swagger alih-alih nilai intnya?
Saya ingin dapat mengirimkan tindakan POST dan memasukkan enum sesuai dengan nilai stringnya tanpa harus melihat enum setiap saat.
Saya mencoba DescribeAllEnumsAsStrings
tetapi server kemudian menerima string alih-alih nilai enum yang bukan yang kami cari.
Apakah ada yang memecahkan ini?
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
}
Jawaban:
Dari dokumen :
Selain itu, jika Anda menginginkan perilaku ini hanya pada tipe dan properti tertentu, gunakan StringEnumConverter:
sumber
DescribeAllEnumsAsStrings
bekerja untuk properti objek dan bahkan parameter kueri pada tindakan pengontrol. Namun, menggunakanEnumDataTypeAttribute
danJsonConverter(typeof(StringEnumConverter))
tidak berhasil untuk saya.Untuk ASP.NET Core 3 dengan pustaka Microsoft JSON (System.Text.Json)
Di Startup.cs / ConfigureServices ():
Untuk ASP.NET Core 3 dengan pustaka Json.NET (Newtonsoft.Json)
Instal
Swashbuckle.AspNetCore.Newtonsoft
paketnya.Di Startup.cs / ConfigureServices ():
Untuk ASP.NET Core 2
Di Startup.cs / ConfigureServices ():
Pra-ASP.NET Core
sumber
AzureExtensions.Swashbuckle
paket tetapi seperti @DanFriedman saya tidak bisa mendapatkan enum-to-string yang berfungsi seperti yang diharapkanJadi saya pikir saya memiliki masalah yang sama. Saya mencari kesombongan untuk menghasilkan enum bersama dengan int -> string mapping. API harus menerima int. Kesombongan-ui kurang penting, yang saya inginkan adalah pembuatan kode dengan enum "nyata" di sisi lain (aplikasi android menggunakan retrofit dalam kasus ini).
Jadi dari penelitian saya ini pada akhirnya tampaknya menjadi batasan spesifikasi OpenAPI yang digunakan Swagger. Tidak mungkin menentukan nama dan nomor untuk enum.
Masalah terbaik yang saya temukan untuk diikuti adalah https://github.com/OAI/OpenAPI-Specification/issues/681 yang terlihat seperti "mungkin segera" tetapi kemudian Swagger harus diperbarui, dan dalam kasus saya Swashbuckle sebagai baik.
Untuk saat ini solusi saya adalah menerapkan filter dokumen yang mencari enum dan mengisi deskripsi yang relevan dengan konten enum.
SwaggerAddEnumDescriptions.cs:
Ini menghasilkan sesuatu seperti berikut pada swagger-ui Anda, jadi setidaknya Anda bisa "melihat apa yang Anda lakukan":
sumber
ASP.NET Core 3.1
Untuk menghasilkan enum sebagai string menggunakan Newtonsoft JSON Anda harus secara eksplisit menambahkan dukungan Newtonsoft dengan menambahkan
AddSwaggerGenNewtonsoftSupport()
sebagai berikut:Ini tersedia melalui paket baru
Swashbuckle.AspNetCore.Newtonsoft
,. Sepertinya semuanya berfungsi dengan baik tanpa paket ini selain dari dukungan konverter enum.sumber
StringEnumConverter
sebagai kasus khusus.Saya ingin menggunakan jawaban rory_za dalam aplikasi .NET Core, tetapi saya harus sedikit memodifikasinya agar berfungsi. Berikut adalah implementasi yang saya buat untuk .NET Core.
Saya juga mengubahnya sehingga tidak menganggap tipe yang mendasarinya adalah
int
, dan menggunakan baris baru di antara nilai-nilai agar lebih mudah dibaca.Kemudian tambahkan ini ke
ConfigureServices
metode Anda di Startup.cs:sumber
DescribeEnumParameters
proyek saya kosong. Saya harus melemparkanparam
keNonBodyParameter
dan memeriksa enum di sana:if (param is NonBodyParameter nbParam && nbParam.Enum?.Any() == true) { param.Description += DescribeEnum(nbParam.Enum); }
Dengan asp.net core 3
Namun tampaknya Swashbuckle Versi 5.0.0-rc4 belum siap mendukungnya. Jadi kita perlu menggunakan opsi (usang) di file konfigurasi Swashbuckle sampai mendukung dan mencerminkannya seperti perpustakaan Newtonsoft.
Perbedaan antara jawaban ini dan jawaban lainnya hanya menggunakan pustaka Microsoft JSON, bukan Newtonsoft.
sumber
.NET CORE 3.1 dan SWAGGER 5
jika Anda membutuhkan solusi sederhana untuk secara selektif membuat enum diteruskan sebagai string:
Perhatikan, kami menggunakan
System.Text.Json.Serialization
namespace, bukanNewtonsoft.Json
!sumber
System.Text.Json
.DescribeAllEnumsAsStrings
akan mengubah semua enum menjadi string.jika ada yang tertarik saya telah memodifikasi kode untuk bekerja dengannya
.NET CORE 3 dan Swagger V5
sumber
Saya baru saja melakukan ini dan berfungsi dengan baik!
Startup.cs
Model.cs
swagger.json
Saya harap ini membantu Anda bagaimana ini membantu saya!
sumber
DescribeAllEnumsAsStrings
tidak digunakan lagisumber
Varian saya untuk sengatan enum dengan nilai:
Konfigurasi Layanan:
Saring:
sumber
tulis kode di dalam Startup.cs
sumber
Saya telah menemukan solusi yang bagus di sini:
@PauloVetor - menyelesaikannya menggunakan ShemaFilter seperti ini:
Dan di Startup.cs:
sumber
model.Format
ke"string"
sebagaimana biasanya"int32"
..Net Core 3.0
sumber
Saya telah mengubah jawaban Hosam Rehani untuk bekerja dengan nullable enum dan juga dengan kumpulan enum. Jawaban sebelumnya juga berfungsi hanya jika sebuah properti dinamai persis seperti tipenya. Semua masalah ini ditangani dalam kode di bawah ini.
Ia bekerja dengan .net core 3.x dan swagger 5.x.
ini bisa lebih efisien dengan tidak mencari jenis enum dua kali dalam beberapa kasus.
untuk menggunakan filter tambahkan
c.DocumentFilter<SwaggerAddEnumDescriptions>();
ke konfigurasi swagger diStartup.cs
.sumber
SOLUSI ASP NET
Dalam dokumen api saya, satu enum masih ditampilkan sebagai int meskipun properti itu ditandai dengan
StringEnumConverter
. Kami tidak mampu menggunakan pengaturan global untuk semua enum yang disebutkan di atas. Menambahkan baris ini di SwaggerConfig memecahkan masalah:sumber
Ada sejumlah kekurangan yang saya temukan di jawaban lain untuk apa yang kami cari, jadi saya pikir saya akan memberikan pendapat saya sendiri tentang ini. Kami menggunakan ASP.NET Core 3.1 dengan System.Text.Json, tetapi pendekatan kami berfungsi terlepas dari serializer JSON yang digunakan.
Tujuan kami adalah untuk menerima nilai string enum bertingkat unta yang lebih rendah di ASP.NET Core API serta mendokumentasikan hal yang sama di Swagger. Saat ini kami menggunakan
[DataContract]
dan[EnumMember]
, jadi pendekatannya adalah dengan mengambil nilai unta-unta yang lebih rendah dari properti nilai EnumMember dan menggunakannya secara keseluruhan.Contoh enum kami:
Kami akan menggunakan nilai EnumMember di Swashbuckle dengan menggunakan ISchemaFilter seperti berikut ini:
Kami menggunakan paket NuGet pihak ketiga ( repo GitHub ) untuk memastikan bahwa skema penamaan ini juga digunakan di ASP.NET Core. Konfigurasikan di Startup.cs dalam ConfigureServices dengan:
Terakhir, kita perlu mendaftarkan ISchemaFilter di Swashbuckle, jadi tambahkan juga berikut ini di ConfigureServices ():
sumber
GetMembers()
akan lebih baik jikaGetMembers(BindingFlags.Static | BindingFlags.Public)
membatasi hanya pada properti enum yang dinyatakan sebenarnya seperti "Biru". Saya juga mengadaptasi kasus "lain" untuk mengembalikan Anggota.Nama jika tidak ada[EnumMember]
atribut.Ini tidak mungkin dengan OpenAPI standar. Enum hanya dijelaskan dengan nilai stringnya.
Untungnya Anda dapat melakukannya dengan beberapa ekstensi non-standar yang digunakan oleh generator klien Anda.
NSwag mendukung
x-enumNames
Dukungan AutoRest
x-ms-enum
.Openapi-generator mendukung
x-enum-varnames
Generator lain mungkin mendukung salah satu ekstensi ini atau memiliki ekstensi sendiri.
Untuk menghasilkan
x-enumNames
NSwag, buat filter skema berikut:Dan daftarkan sebagai:
sumber
Jika versi swagger adalah 5.5.x, maka Anda perlu:
menginstal: Instal-Paket Swashbuckle.AspNetCore.Newtonsoft -Version 5.5.0
services.AddSwaggerGenNewtonsoftSupport ();
Referensi: https://github.com/domaindrivendev/Swashbuckle.AspNetCore#systemtextjson-stj-vs-newtonsoft
sumber