Saya ingin menangani POST dari Panggilan API berikut:
/v1/location/deviceid/appid
Parameter tambahan berasal dari Post-Body.
Ini semua bekerja dengan baik untuk saya. Sekarang saya ingin memperpanjang kode saya dengan mengizinkan "deviceid" dan / atau "appid" dan / atau BodyData menjadi null:
/v1/location/deviceid
/v1/location/appid
/v1/location/
3 URL ini harus ditanggapi dengan rute yang sama.
Pendekatan pertama saya (diperlukan BodyData):
[Route("v1/location/{deviceid}/{appid}", Name = "AddNewLocation")]
public location_fromuser Post(string deviceid = null, string appid = null, [FromBody] location_fromuser BodyData)
{
return repository.AddNewLocation(deviceid, appid, BodyData);
}
Ini tidak berfungsi dan mengembalikan kesalahan kompilasi:
"Parameter opsional harus di akhir"
Percobaan berikutnya:
[Route("v1/location/{deviceid}/{appid}", Name = "AddNewLocation")]
public location_fromuser Post([FromBody] location_fromuser BodyData, string deviceid = null, string appid = null)
Sekarang fungsi saya AddNewLocation () selalu menjadi BodyData=null
- bahkan jika panggilan mengirim Body.
Akhirnya saya mengatur semua 3 Parameter opsional:
[Route("v1/location/{deviceid}/{appid}", Name = "AddNewLocation")]
public location_fromuser Post(string deviceid = null, string appid = null, [FromBody location_fromuser BodyData = null)
Jangan bekerja:
Parameter opsional
BodyData
tidak didukung olehFormatterParameterBinding
.
Mengapa saya menginginkan solusi dengan Parameter opsional? Kontroler Saya hanya menangani "penambahan Lokasi baru" melalui POST.
Saya ingin mengirim data yang salah pengecualian saya sendiri atau pesan kesalahan. Bahkan jika panggilan tersebut memiliki nilai yang hilang. Dalam hal ini saya ingin dapat memutuskan untuk melempar pengecualian atau Mengatur Default dengan kode saya.
sumber
?
di dalam template rute inilah yang saya cari. +1?
karakter maka kita harus memberikan nilai default ke parameter di tanda tangan metode misalnya MyMethod (nama string = "someDefaultValue", int? Id = null).Info lain: Jika Anda ingin menggunakan Route Constraint , bayangkan Anda ingin memaksa parameter itu memiliki tipe data int , maka Anda perlu menggunakan sintaks ini:
[Route("v1/location/**{deviceOrAppid:int?}**", Name = "AddNewLocation")]
Itu ? Karakter yang dimasukkan selalu sebelum yang terakhir } karakter
Untuk informasi selengkapnya, lihat: Parameter URI Opsional dan Nilai Default
sumber
Mengubah komentar saya menjadi jawaban untuk melengkapi jawaban @Kiran Chala karena tampaknya membantu para penonton-
Ketika kita menandai parameter sebagai opsional dalam tindakan uri menggunakan
?
karakter maka kita harus memberikan nilai default ke parameter di tanda tangan metode seperti yang ditunjukkan di bawah ini:MyMethod(string name = "someDefaultValue", int? Id = null)
sumber