Web Api Öznitelik Yönlendirmesinde İsteğe Bağlı Parametreler


93

Aşağıdaki API Çağrısının POST'unu işlemek istiyorum:

/v1/location/deviceid/appid

Post-Body'den ek Parametreler geliyor.

Bunların hepsi benim için iyi çalışıyor. Şimdi "deviceid" ve / veya "appid" ve / veya BodyData'nın boş olmasına izin vererek kodumu genişletmek istiyorum:

/v1/location/deviceid
/v1/location/appid
/v1/location/

Bu 3 URL aynı yoldan yanıt vermelidir.

İlk yaklaşımım (BodyData gerekli):

[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);
}

Bu çalışmaz ve bir derleme hatası döndürür:

"isteğe bağlı Parametreler en sonunda olmalıdır"

Sonraki deneyin:

[Route("v1/location/{deviceid}/{appid}", Name = "AddNewLocation")]
public location_fromuser Post([FromBody] location_fromuser BodyData, string deviceid = null, string appid = null)

Şimdi benim fonksiyonum AddNewLocation () her zaman bir BodyData=null- çağrı Vücut'u gönderse bile.

Sonunda 3 Parametrenin tümünü isteğe bağlı olarak ayarladım:

[Route("v1/location/{deviceid}/{appid}", Name = "AddNewLocation")]
public location_fromuser Post(string deviceid = null, string appid = null, [FromBody location_fromuser BodyData = null)

Çalışmayın:

İsteğe bağlı parametre BodyDatatarafından desteklenmez FormatterParameterBinding.

Neden isteğe bağlı Parametrelerle bir çözüm istiyorum? Denetleyicim bir POST yoluyla yalnızca "yeni bir Konum eklemeyi" yönetir.

Yanlış verilere kendi istisnalarımı veya hata mesajlarımı göndermek istiyorum. Çağrıda eksik değerler olsa bile. Bu durumda, koduma göre bir istisna veya Ayar Varsayılanları atmaya karar verebilmek istiyorum.

Yanıtlar:


182

Gelen bir istek için gibi /v1/location/1234bunu Web API için zor olurdu tahmin edebileceğiniz gibi segmentin değeri '1234' karşılık gelen otomatik anlamaya ile ilgilidir appidve değil deviceid.

Bence rota şablonunuzu benzer olacak şekilde değiştirmeli [Route("v1/location/{deviceOrAppid?}", Name = "AddNewLocation")]ve ardından deiveOrAppidid türünü bulmak için ayrıştırmalısınız .

Ayrıca, yol şablonundaki segmentleri isteğe bağlı yapmanız gerekir, aksi takdirde segmentler gerekli kabul edilir. ?Bu durumda karakteri not edin . Örneğin: [Route("v1/location/{deviceOrAppid?}", Name = "AddNewLocation")]


58
?rota şablonunun içinde aradığım şey vardı. +1
Kal_Torak

4
"DeviceOrAppId" nin en iyi tasarım seçeneği olduğunu söyleyemem. API'nin her zaman mümkünse ne alacağını tanıması gerektiğini düşünüyorum.
Niels Brinch

14
Sadece bilgi için - Bir parametreyi eylem uri'sinde ?karakter kullanarak isteğe bağlı olarak işaretlediğimizde , yöntem imzasındaki parametrelere varsayılan değerler sağlamalıyız, örneğin MyMethod (string name = "someDefaultValue", int? Id = null).
RBT

@RBT sen gerçek MVP'sin, bir dakikalığına orada kaldım. Teşekkür ederim!
sm

1
Güzel. Size yardımcı olduğu için sevindim @sm Yorumumu yararlı göründüğü için daha iyi görünürlük için bir yanıta dönüştürdüm. Kiran'ın gönderisine bir eklenti olacak.
RBT

47

Başka bir bilgi: Bir Rota Kısıtlaması kullanmak istiyorsanız , bu parametrenin int veri türüne sahip olmasını istediğinizi hayal edin , o zaman şu sözdizimini kullanmanız gerekir:

[Route("v1/location/**{deviceOrAppid:int?}**", Name = "AddNewLocation")]

? karakter her zaman son } karakterden önce gelir

Daha fazla bilgi için bkz: İsteğe Bağlı URI Parametreleri ve Varsayılan Değerler


18

Yorumumu bir cevaba dönüştürmek, @Kiran Chala'nın cevabını, izleyiciler için yararlı göründüğü için tamamlıyor.

Action uri'de bir parametreyi ?karakter kullanarak isteğe bağlı olarak işaretlediğimizde, aşağıda gösterildiği gibi yöntem imzasındaki parametrelere varsayılan değerleri sağlamalıyız:

MyMethod(string name = "someDefaultValue", int? Id = null)


Ben de aynısını yorumlayacaktım.
Jnr
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.