Saya mencoba memposting beberapa parameter pada pengontrol WebAPI. Satu param adalah dari URL, dan yang lainnya dari tubuh. Ini urlnya:
/offers/40D5E19D-0CD5-4FBD-92F8-43FDBB475333/prices/
Ini kode pengontrol saya:
public HttpResponseMessage Put(Guid offerId, OfferPriceParameters offerPriceParameters)
{
//What!?
var ser = new DataContractJsonSerializer(typeof(OfferPriceParameters));
HttpContext.Current.Request.InputStream.Position = 0;
var what = ser.ReadObject(HttpContext.Current.Request.InputStream);
return new HttpResponseMessage(HttpStatusCode.Created);
}
Konten tubuh ada di JSON:
{
"Associations":
{
"list": [
{
"FromEntityId":"276774bb-9bd9-4bbd-a7e7-6ed3d69f196f",
"ToEntityId":"ed0d2616-f707-446b-9e40-b77b94fb7d2b",
"Types":
{
"list":[
{
"BillingCommitment":5,
"BillingCycle":5,
"Prices":
{
"list":[
{
"CurrencyId":"274d24c9-7d0b-40ea-a936-e800d74ead53",
"RecurringFee":4,
"SetupFee":5
}]
}
}]
}
}]
}
}
Adakah yang tahu mengapa pengikatan default tidak dapat mengikat offerPriceParameters
argumen controller saya? Itu selalu diatur ke nol. Tetapi saya dapat memulihkan data dari tubuh menggunakan DataContractJsonSerializer
.
Saya juga mencoba menggunakan FromBody
atribut argumen tetapi tidak berhasil juga.
.net
asp.net-web-api
Normand Bedard
sumber
sumber
Native WebAPI tidak mendukung pengikatan beberapa parameter POST. Seperti yang ditunjukkan oleh Colin, ada sejumlah batasan yang diuraikan dalam posting blog saya sebagai referensi.
Ada solusi dengan membuat pengikat parameter khusus. Kode untuk melakukan ini jelek dan berbelit-belit, tetapi saya telah memposting kode bersama dengan penjelasan terperinci di blog saya, siap untuk dihubungkan ke proyek di sini:
Melewati beberapa Nilai POST sederhana ke ASP.NET Web API
sumber
Jika perutean atribut sedang digunakan, Anda dapat menggunakan atribut [FromUri] dan [FromBody].
Contoh:
sumber
[FromRoute]
bukannya[FromUri]
Kami melewati objek Json dengan metode HttpPost, dan menguraikannya dalam objek dinamis. ini bekerja dengan baik. ini adalah contoh kode:
webapi:
Jenis objek yang kompleks bisa berupa objek, array, dan kamus.
sumber
Kelas parameter sederhana dapat digunakan untuk melewatkan beberapa parameter dalam sebuah posting:
sumber
Anda dapat mengizinkan beberapa parameter POST dengan menggunakan kelas MultiPostParameterBinding dari https://github.com/keith5000/MultiPostParameterBinding
Untuk menggunakannya:
1) Unduh kode di folder Sumber dan tambahkan ke proyek API Web Anda atau proyek lain dalam solusinya.
2) Gunakan atribut [MultiPostParameters] pada metode tindakan yang perlu mendukung beberapa parameter POST.
3) Tambahkan baris ini di Global.asax.cs ke metode Application_Start di mana saja sebelum panggilan ke GlobalConfiguration.Configure (WebApiConfig.Register) :
4) Minta klien Anda melewati parameter sebagai properti objek. Contoh objek JSON untuk
DoSomething(param1, param2, param3)
metode ini adalah:Contoh JQuery:
Kunjungi tautannya untuk detail lebih lanjut.
Penafian: Saya terkait langsung dengan sumber daya yang ditautkan.
sumber
Pertanyaan dan komentar yang bagus - banyak belajar dari balasan di sini :)
Sebagai contoh tambahan, perhatikan bahwa Anda juga dapat mencampur tubuh dan rute misalnya
Memanggil seperti ini:
sumber
Seperti apa routeTemplate Anda untuk kasus ini?
Anda memposting url ini:
Agar ini berfungsi, saya harapkan perutean seperti ini di
WebApiConfig
:Asumsi lain adalah: - controller Anda dipanggil
OffersController
. - objek JSON yang Anda lewati di badan permintaan bertipeOfferPriceParameters
(bukan tipe turunan) - Anda tidak memiliki metode lain pada pengontrol yang dapat mengganggu yang ini (jika Anda melakukannya, coba beri komentar dan lihat apa terjadi)Dan seperti yang Filip katakan akan membantu pertanyaan Anda jika Anda mulai menerima beberapa jawaban karena 'terima tingkat 0%' mungkin membuat orang berpikir bahwa mereka membuang-buang waktu mereka
sumber
Jika Anda tidak ingin menggunakan ModelBinding, Anda dapat menggunakan DTO untuk melakukan ini untuk Anda. Misalnya, buat tindakan POST di DataLayer yang menerima tipe kompleks dan mengirim data dari BusinessLayer. Anda dapat melakukannya jika ada panggilan UI-> API.
Berikut adalah contoh DTO. Tetapkan Guru untuk Siswa dan Tetapkan beberapa makalah / subjek untuk Siswa.
Maka tindakan dalam DataLayer dapat dibuat sebagai:
Untuk memanggilnya dari BusinessLayer:
Sekarang ini masih akan berfungsi jika saya ingin mengirim data beberapa Siswa sekaligus. Ubah
MyAction
seperti di bawah ini. Tidak perlu menulis [FromBody], WebAPI2 menggunakan tipe kompleks [FromBody] secara default.dan kemudian saat memanggilnya, berikan
List<StudentCurriculumDTO>
data.sumber
Parameter permintaan seperti
Kode api web menjadi seperti
sumber
Anda bisa mendapatkan formdata sebagai string:
https://docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/sending-html-form-data-part-2
sumber