Saya memiliki layanan REST ASP.NET Web API (versi 4) di mana saya harus melewati array bilangan bulat.
Inilah metode tindakan saya:
public IEnumerable<Category> GetCategories(int[] categoryIds){
// code to retrieve categories from database
}
Dan ini adalah URL yang saya coba:
/Categories?categoryids=1,2,3,4
c#
arrays
rest
asp.net-web-api
Hemanshu Bhojak
sumber
sumber
Jawaban:
Anda hanya perlu menambahkan
[FromUri]
sebelum parameter, seperti:Dan kirim permintaan:
sumber
Seperti yang ditunjukkan Filip W , Anda mungkin harus menggunakan pengikat model khusus seperti ini (dimodifikasi untuk mengikat ke jenis param yang sebenarnya):
Dan kemudian Anda bisa mengatakan:
/Categories?categoryids=1,2,3,4
dan ASP.NET Web API akan mengikatcategoryIds
array Anda dengan benar .sumber
ModelBinderAttribute
sehingga dapat digunakan secara langsung alih-alih sintaks yang sulit menggunakantypeof()
argumen. Yang harus Anda lakukan adalah mewarisi seperti:CommaDelimitedArrayModelBinder : ModelBinderAttribute, IModelBinder
dan kemudian menyediakan konstruktor default yang mendorong definisi jenis ke kelas dasar:public CommaDelimitedArrayModelBinder() : base(typeof(CommaDelimitedArrayModelBinder)) { }
.System.Collections.Generic.List<long>
yangbindingContext.ModelType.GetElementType()
hanya mendukungSystem.Array
jenisSaya baru-baru ini menemukan persyaratan ini sendiri, dan saya memutuskan untuk menerapkan suatu
ActionFilter
untuk menangani ini.Saya menerapkannya seperti itu (perhatikan bahwa saya menggunakan 'id', bukan 'id', seperti yang ditentukan dalam rute saya):
Dan url publik adalah:
Anda mungkin harus memperbaiki ini untuk memenuhi kebutuhan spesifik Anda.
sumber
Jika seseorang perlu - untuk mencapai hal yang sama atau serupa (seperti delete) melalui
POST
alih-alihFromUri
, gunakanFromBody
dan di sisi klien (JS / jQuery) format param sebagai$.param({ '': categoryids }, true)
c #:
jQuery:
Masalahnya
$.param({ '': categoryids }, true)
adalah bahwa .net akan mengharapkan post body berisi nilai urlencoded seperti=1&=2&=3
tanpa nama parameter, dan tanpa tanda kurung.sumber
code to retrieve categories from database
, jadi metode ini haruslah metode GET, bukan POST.Cara mudah untuk mengirim parameter array ke api web
API
Jquery: mengirim objek JSON sebagai params permintaan
Ini akan menghasilkan URL permintaan Anda seperti
../api/categories/GetCategories?categoryIds=1&categoryIds=2&categoryIds=3&categoryIds=4
sumber
Anda dapat mencoba kode ini untuk mengambil nilai yang dipisahkan koma / array nilai untuk mendapatkan kembali JSON dari webAPI
Keluaran:
sumber
Solusi ASP.NET Core 2.0 (Swagger Ready)
Memasukkan
Kode
Tulis penyedia (bagaimana MVC tahu binder apa yang digunakan)
Tulis binder yang sebenarnya (akses segala macam info tentang permintaan, tindakan, model, tipe, apa pun)
Daftarkan ke MVC
Penggunaan sampel dengan pengontrol yang terdokumentasi dengan baik untuk Swagger
EDIT: Microsoft merekomendasikan untuk menggunakan TypeConverter untuk anak-anak operasi ini melalui pendekatan ini. Jadi ikuti saran poster di bawah ini dan dokumentasikan jenis kustom Anda dengan SchemaFilter.
sumber
Alih-alih menggunakan ModelBinder khusus, Anda juga dapat menggunakan tipe khusus dengan TypeConverter.
Keuntungannya adalah membuat parameter metode API Web sangat sederhana. Anda bahkan tidak perlu menentukan [FromUri].
Contoh ini untuk Daftar string, tetapi Anda bisa melakukan
categoryIds.Select(int.Parse)
atau hanya menulis IntList saja.sumber
Saya awalnya menggunakan solusi yang @Mrchief selama bertahun-tahun (ini bekerja dengan baik). Tetapi ketika saya menambahkan Swagger ke proyek saya untuk dokumentasi API, titik akhir saya TIDAK muncul.
Butuh beberapa saat, tetapi inilah yang saya hasilkan. Ini bekerja dengan Swagger, dan tanda tangan metode API Anda terlihat lebih bersih:
Pada akhirnya yang bisa Anda lakukan:
WebApiConfig.cs
Buat kelas baru: CommaDelimitedArrayParameterBinder.cs
Buat kelas baru: StringToIntArrayConverter.cs
Catatan:
sumber
Pemakaian:
Minta uri
sumber
/
sebagai pemisah? Maka Anda dapat memiliki: dns / root / mystuff / path / ke / some / resource dipetakan kepublic string GetMyStuff(params string[] pathBits)
Jika Anda ingin daftar / array bilangan bulat cara termudah untuk melakukan ini adalah menerima daftar string yang dipisahkan koma (,) dan mengubahnya menjadi daftar bilangan bulat. Jangan lupa untuk menyebutkan [FromUri] attriubte. Url Anda terlihat seperti:
sumber
List<string>
bukan hanyastring
? itu hanya akan memiliki satu string di dalamnya yang ada1,2,3,289,56
dalam contoh Anda. Saya akan menyarankan hasil edit.List<Guid>
otomatis. Catatan di Asp.net Core anotasi itu[FromQuery]
, dan itu tidak diperlukan.Buat tipe metode [HttpPost], buat model yang memiliki satu parameter int [], dan poskan dengan json:
sumber
public IEnumerable<Category> GetCategories(int[] categoryIds){
- Ya, Anda bisa menafsirkan dengan cara yang berbeda saya kira. Tetapi sering kali, saya tidak ingin membuat kelas wrapper demi menciptakan pembungkus. Jika Anda memiliki objek yang kompleks, maka itu hanya akan berfungsi. Mendukung kasus-kasus sederhana ini adalah apa yang tidak berhasil, maka OP.POST
ini sebenarnya bertentangan dengan paradigma REST. Dengan demikian, API semacam itu tidak akan menjadi REST API.Atau Anda bisa meneruskan serangkaian item terbatas dan memasukkannya ke dalam array atau daftar di ujung penerima.
sumber
Saya membahas masalah ini dengan cara ini.
Saya menggunakan pesan pos ke api untuk mengirim daftar bilangan bulat sebagai data.
Lalu saya mengembalikan data sebagai ienumerable.
Kode pengiriman adalah sebagai berikut:
Kode penerima adalah sebagai berikut:
Ini berfungsi dengan baik untuk satu catatan atau banyak catatan. Isi adalah metode kelebihan beban menggunakan DapperExtensions:
Ini memungkinkan Anda untuk mengambil data dari tabel komposit (daftar id), dan kemudian mengembalikan catatan yang benar-benar Anda minati dari tabel target.
Anda bisa melakukan hal yang sama dengan sebuah tampilan, tetapi ini memberi Anda sedikit lebih banyak kontrol dan fleksibilitas.
Selain itu, detail apa yang Anda cari dari database tidak ditampilkan dalam string kueri. Anda juga tidak perlu mengonversi dari file csv.
Anda harus ingat ketika menggunakan alat apa pun seperti antarmuka web api 2.x adalah bahwa fungsi get, put, post, delete, head, dll. Memiliki penggunaan umum, tetapi tidak terbatas pada penggunaan itu.
Jadi, sementara posting umumnya digunakan dalam konteks buat di antarmuka api web, itu tidak terbatas pada penggunaan itu. Ini adalah panggilan html biasa yang dapat digunakan untuk tujuan apa pun yang diizinkan oleh praktik html.
Selain itu, perincian tentang apa yang sedang terjadi tersembunyi dari "mata yang mengintip" yang kita dengar banyak tentang hari-hari ini.
Fleksibilitas dalam penamaan konvensi di web api 2.x antarmuka dan penggunaan panggilan web biasa berarti Anda mengirim panggilan ke web api yang menyesatkan pengintai untuk berpikir Anda benar-benar melakukan sesuatu yang lain. Anda dapat menggunakan "POST" untuk benar-benar mengambil data, misalnya.
sumber
Saya telah membuat pengikat model khusus yang mengubah nilai yang dipisahkan koma (hanya primitif, desimal, float, string) ke array yang sesuai.
Dan cara menggunakan di Controller:
sumber
Solusi saya adalah membuat atribut untuk memvalidasi string, ia melakukan banyak fitur umum tambahan, termasuk validasi regex yang dapat Anda gunakan untuk memeriksa angka saja dan kemudian saya mengonversi ke bilangan bulat sesuai kebutuhan ...
Ini adalah bagaimana Anda menggunakan:
sumber