वेब एपी एट्रीब्यूट रूटिंग में ऑप्शनल पैरामीटर्स


89

मैं निम्नलिखित एपीआई कॉल के POST को संभालना चाहता हूं:

/v1/location/deviceid/appid

अतिरिक्त पैरामीटर पोस्ट-बॉडी से आ रहे हैं।

यह सब मेरे लिए ठीक काम करता है। अब मैं अपने डिवाइस को "डिवाइसिड" और / या "एपिड" और / या बॉडीडाटा की अनुमति देने के लिए अपने कोड का विस्तार करना चाहता हूं:

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

इन 3 URL को एक ही मार्ग से जवाब दिया जाना चाहिए।

मेरा पहला दृष्टिकोण (बॉडीडेटा आवश्यक):

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

यह काम नहीं करता है और एक संकलन त्रुटि देता है:

"वैकल्पिक पैरामीटर अंत में होना चाहिए"

अगला प्रयास:

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

अब मेरा कार्य AddNewLocation () हमेशा मिलता है BodyData=null- भले ही कॉल बॉडी भेजें।

अंत में मैंने सभी 3 पैरामीटर को वैकल्पिक रखा:

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

काम नहीं:

वैकल्पिक पैरामीटर BodyDataद्वारा समर्थित नहीं है FormatterParameterBinding

मुझे वैकल्पिक पैरामीटर्स के साथ एक समाधान क्यों चाहिए? मेरा नियंत्रक एक POST के माध्यम से बस "एक नए स्थान को जोड़ने" को संभालता है।

मैं गलत डेटा पर अपने स्वयं के अपवाद या त्रुटि संदेश भेजना चाहता हूं। भले ही कॉल में लापता मान हो। इस मामले में मैं अपने कोड द्वारा एक अपवाद या सेटिंग डिफॉल्ट्स को फेंकने का निर्णय लेने में सक्षम होना चाहता हूं।

जवाबों:


176

जैसे आने वाले अनुरोध के लिए /v1/location/1234, जैसा कि आप कल्पना कर सकते हैं कि वेब एपीआई के लिए स्वचालित रूप से यह पता लगाना मुश्किल होगा कि '1234' के अनुरूप खंड का मूल्य किससे संबंधित है appidऔर नहीं deviceid

मुझे लगता है कि आपको अपने रूट टेम्पलेट को बदलना चाहिए [Route("v1/location/{deviceOrAppid?}", Name = "AddNewLocation")]और फिर deiveOrAppidआईडी के प्रकार का पता लगाने के लिए पार्स करना चाहिए ।

इसके अलावा, आपको सेगमेंट को रूट टेम्पलेट में वैकल्पिक बनाने की आवश्यकता है अन्यथा सेगमेंट को आवश्यक माना जाता है। ?इस मामले में चरित्र पर ध्यान दें । उदाहरण के लिए: [Route("v1/location/{deviceOrAppid?}", Name = "AddNewLocation")]


56
?मार्ग टेम्पलेट के अंदर वही है जिसकी मुझे तलाश थी। +1
Kal_Torak

4
मैं यह नहीं कहूंगा कि "deviceOrAppId" सबसे अच्छा डिज़ाइन विकल्प है। मुझे लगता है कि एपीआई को हमेशा परिभाषा से पता होना चाहिए कि यह संभव होने पर क्या प्राप्त होगा।
नील्स ब्रिंच

14
बस जानकारी के लिए - जब हम ?वर्ण का उपयोग करते हुए एक्शन उरई में एक पैरामीटर को वैकल्पिक के रूप में चिह्नित करते हैं, तो हमें विधि हस्ताक्षर में मापदंडों के लिए डिफ़ॉल्ट मान प्रदान करना होगा जैसे MyMethod (स्ट्रिंग नाम = "someDefaultValue", int? Id = null)।
RBT

@ आरबीटी यू दा असली एमवीपी, मैं एक मिनट के लिए वहां रुक गया। धन्यवाद!
एस एम

1
ठंडा। खुशी है कि इसने आपकी मदद की @ लोगों ने मेरी टिप्पणी को बेहतर दृश्यता के लिए एक उत्तर में बदल दिया क्योंकि यह सहायक लगता है। यह किरन के पद के लिए एक ऐड होगा।
RBT

45

एक अन्य जानकारी: यदि आप रूट बाधा का उपयोग करना चाहते हैं , तो कल्पना करें कि आप बल चाहते हैं कि पैरामीटर में अंतर डेटाटाइप है, तो आपको इस सिंटैक्स का उपयोग करने की आवश्यकता है:

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

? चरित्र को हमेशा अंतिम } चरित्र से पहले रखा जाता है

अधिक जानकारी के लिए देखें: वैकल्पिक URI पैरामीटर और डिफ़ॉल्ट मान


18

मेरी टिप्पणी को @Kiran Chala के उत्तर के पूरक के रूप में प्रस्तुत करना क्योंकि यह दर्शकों के लिए मददगार लगता है-

जब हम ?वर्ण का उपयोग करते हुए एक्शन उरई में एक पैरामीटर को वैकल्पिक के रूप में चिह्नित करते हैं, तो हमें विधि हस्ताक्षर में मापदंडों को डिफ़ॉल्ट मान प्रदान करना चाहिए जैसा कि नीचे दिखाया गया है:

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


मैं उसी के बारे में टिप्पणी करने वाला था।
Jnr
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.