ASP.NET वेब API` में विशेषताओं FromBody
और FromUri
विशेषताओं की आवश्यकता क्यों है ?
विशेषताओं का उपयोग करने और उनका उपयोग न करने के बीच क्या अंतर हैं?
ASP.NET वेब API` में विशेषताओं FromBody
और FromUri
विशेषताओं की आवश्यकता क्यों है ?
विशेषताओं का उपयोग करने और उनका उपयोग न करने के बीच क्या अंतर हैं?
जवाबों:
जब ASP.NET वेब एपीआई नियंत्रक पर एक विधि कहता है, तो इसे पैरामीटर के लिए मान सेट करना होगा, एक प्रक्रिया जिसे पैरामीटर बाइंडिंग कहा जाता है ।
डिफ़ॉल्ट रूप से, वेब एपीआई मापदंडों को बांधने के लिए निम्नलिखित नियमों का उपयोग करता है:
यदि पैरामीटर एक "सरल" प्रकार है , तो वेब API URI से मान प्राप्त करने का प्रयास करता है । सरल प्रकारों में .NET आदिम प्रकार (इंट, बूल, डबल, और इसके बाद के संस्करण), प्लस टाइमस्पैन, डेटाइम, गाइड, दशमलव और स्ट्रिंग शामिल हैं, साथ ही किसी भी प्रकार के कनवर्टर के साथ कोई भी प्रकार जो स्ट्रिंग से परिवर्तित कर सकता है।
जटिल प्रकारों के लिए , वेब एपीआई मीडिया-प्रकार के फ़ॉर्मेटर का उपयोग करके, संदेश निकाय से मान को पढ़ने की कोशिश करता है ।
इसलिए, यदि आप उपर्युक्त डिफ़ॉल्ट व्यवहार को ओवरराइड करना चाहते हैं और वेब एपीआई को URI से एक जटिल प्रकार पढ़ने के लिए मजबूर करते हैं, [FromUri]
तो पैरामीटर में विशेषता जोड़ें । वेब API को अनुरोध निकाय से एक सरल प्रकार पढ़ने के लिए बाध्य [FromBody]
करने के लिए, पैरामीटर में विशेषता जोड़ें ।
इसलिए, आपके प्रश्न का उत्तर देने के लिए, वेब API में [FromBody]
और [FromUri]
विशेषताओं की आवश्यकता केवल ओवरराइड करने के लिए है, यदि आवश्यक हो, तो ऊपर वर्णित डिफ़ॉल्ट व्यवहार। ध्यान दें कि आप नियंत्रक विधि के लिए दोनों विशेषताओं का उपयोग कर सकते हैं, लेकिन केवल विभिन्न मापदंडों के लिए, जैसा कि यहां दिखाया गया है ।
नहीं है एक बहुत अधिक जानकारी वेब पर अगर आप गूगल "वेब एपीआई बाध्यकारी पैरामीटर"।
JustGetIt
जो कई विशेषताओं जैसे [FromBody, FromQuery]
आदि को जोड़ने का एक ही उद्देश्य पेश करता है
डिफ़ॉल्ट व्यवहार है:
पैरामीटर है आदिम प्रकार ( int
, bool
, double
, ...), वेब एपीआई की कोशिश करता से मूल्य प्राप्त करने के यूआरआई HTTP अनुरोध की।
के लिए जटिल प्रकार (अपनी खुद की वस्तु, उदाहरण के लिए: Person
), वेब एपीआई की कोशिश करता से मूल्य को पढ़ने के लिए शरीर HTTP अनुरोध की।
इसलिए, यदि आपके पास:
... तो आपको कोई विशेषता नहीं जोड़ना है (न [FromBody]
ही [FromUri]
)।
लेकिन, यदि आपके पास शरीर में एक आदिम प्रकार है , तो आपको जोड़ना होगा[FromBody]
अपने WebAP नियंत्रक विधि में अपने आदिम प्रकार के पैरामीटर के सामने । (क्योंकि, डिफ़ॉल्ट रूप से, WebAPI HTTP अनुरोध के URI में आदिम प्रकारों की तलाश कर रहा है।)
या, यदि आपके यूआरआई में एक जटिल प्रकार है , तो आपको जोड़ना होगा[FromUri]
। (क्योंकि, डिफ़ॉल्ट रूप से, WebAPI डिफ़ॉल्ट रूप से HTTP अनुरोध के शरीर में जटिल प्रकारों की तलाश में है।)
आदिम प्रकार:
public class UsersController : ApiController
{
// api/users
public HttpResponseMessage Post([FromBody]int id)
{
}
// api/users/id
public HttpResponseMessage Post(int id)
{
}
}
जटिल प्रकार:
public class UsersController : ApiController
{
// api/users
public HttpResponseMessage Post(User user)
{
}
// api/users/user
public HttpResponseMessage Post([FromUri]User user)
{
}
}
यह तब तक काम करता है जब तक आप अपने HTTP अनुरोध में केवल एक पैरामीटर भेजते हैं। एकाधिक भेजते समय , आपको एक कस्टम मॉडल बनाने की आवश्यकता होती हैजिसमें आपके सभी पैरामीटर इस तरह हों:
public class MyModel
{
public string MyProperty { get; set; }
public string MyProperty2 { get; set; }
}
[Route("search")]
[HttpPost]
public async Task<dynamic> Search([FromBody] MyModel model)
{
// model.MyProperty;
// model.MyProperty2;
}
ASP.NET वेब API में पैरामीटर बाइंडिंग के लिए Microsoft के दस्तावेज़ से :
जब एक पैरामीटर में [FromBody] होता है, तो वेब एपीआई एक फ़ॉर्मेटर का चयन करने के लिए सामग्री-प्रकार हेडर का उपयोग करता है। इस उदाहरण में, सामग्री प्रकार "एप्लिकेशन / json" है और अनुरोध निकाय एक कच्चा JSON स्ट्रिंग है (JSON ऑब्जेक्ट नहीं)। अधिकतम एक पैरामीटर पर संदेश निकाय से पढ़ने की अनुमति है।
यह काम करना चाहिए:
public HttpResponseMessage Post([FromBody] string name) { ... }
यह काम नहीं करेगा:
// Caution: This won't work! public HttpResponseMessage Post([FromBody] int id, [FromBody] string name) { ... }
इस नियम का कारण यह है कि अनुरोध निकाय को गैर-बफर स्ट्रीम में संग्रहीत किया जा सकता है जिसे केवल एक बार पढ़ा जा सकता है।
बस उपरोक्त उत्तर के अलावा ..
[FromUri] का उपयोग क्वेरिस्ट्रिंग से मापदंडों को पारित करने के बजाय उरी मापदंडों से जटिल प्रकारों को बांधने के लिए भी किया जा सकता है
पूर्व के लिए ..
public class GeoPoint
{
public double Latitude { get; set; }
public double Longitude { get; set; }
}
[RoutePrefix("api/Values")]
public ValuesController : ApiController
{
[Route("{Latitude}/{Longitude}")]
public HttpResponseMessage Get([FromUri] GeoPoint location) { ... }
}
जैसे कहा जा सकता है:
http://localhost/api/values/47.678558/-122.130989
जब एक पैरामीटर में [FromBody] होता है, तो वेब एपीआई एक फ़ॉर्मेटर का चयन करने के लिए सामग्री-प्रकार हेडर का उपयोग करता है। इस उदाहरण में, सामग्री प्रकार "एप्लिकेशन / json" है और अनुरोध निकाय एक कच्चा JSON स्ट्रिंग है (JSON ऑब्जेक्ट नहीं)।
संदेश बॉडी से अधिकतम एक पैरामीटर को पढ़ने की अनुमति है। तो यह काम नहीं करेगा:
// Caution: Will not work!
public HttpResponseMessage Post([FromBody] int id, [FromBody] string name) { ... }
इस नियम का कारण यह है कि अनुरोध निकाय को गैर-बफर स्ट्रीम में संग्रहीत किया जा सकता है जिसे केवल एक बार पढ़ा जा सकता है
कृपया अधिक जानकारी के लिए वेबसाइट पर जाएं : http://www.asp.net/web-api/overview/formats-and-model-binding/parameter-binding-in-aspnet-web-api