क्या कोई मुझे CreatedAtRoute () समझा सकता है?


136

वेब एपीआई 2 के लिए टेम्पलेट से, एक पोस्ट विधि हमेशा इस तरह होती है:

[ResponseType(typeof(MyDTO))]
public IHttpActionResult PostmyObject(MyDTO myObject)
{
    ...
    return CreatedAtRoute("DefaultApi", new { id = myObject.Id }, myObject);
}

मैं इस CreatedAtRoute()विधि को नहीं समझता । क्या कोई CreatedAtRoute()मुझे विधि समझा सकता है ?


25
@ जॉनसुंडर्स निश्चित रूप से मैंने उन Google परिणामों को पाया। मेरी समस्या यह है कि ये दस्तावेज़ मुझे इस पद्धति को समझने में मदद नहीं करते हैं, इन्हें पढ़ने के बाद भी मुझे समझ में नहीं आता है। इसलिए मैं यहां पूछता हूं।
मार्शल

11
मैं आपको मेरे सवाल का जवाब देने के लिए नहीं हूँ।
मार्शल

12
यदि मैं Google और उत्तर पा सकता हूं, तो मैं यहां प्रश्न संपादित करने और पूछने के लिए समय बिताने के लिए परेशान क्यों हूं?
मार्शल

3
यह सवाल पूछने के लिए धन्यवाद :)
विदर

जवाबों:


157

CreatedAtRouteविधि नव निर्मित संसाधन के लिए एक यूआरआइ वापस जाने के लिए जब आप कुछ नई वस्तु स्टोर करने के लिए एक POST विधि आह्वान करना है। इसलिए यदि आप उदाहरण के लिए एक ऑर्डर आइटम POST करते हैं, तो आप 'api / ऑर्डर / 11' (11 स्पष्ट रूप से ऑर्डर की आईडी होने के नाते) जैसे मार्ग को वापस कर सकते हैं।

BTW मैं सहमत हूँ कि MSDN लेख को यह समझने में कोई फायदा नहीं है। जिस मार्ग पर आप वास्तव में लौटेंगे, वह स्वाभाविक रूप से आपके रूटिंग सेटअप पर निर्भर करेगा।


13
क्या यह रिटर्न वास्तव में एक CreatedAtRouteNegotiatedContentResult <myObject> ऑब्जेक्ट है! यदि आप अपनी कार्रवाई पर एक इकाई परीक्षण चलाते हैं, तो आप यही देखेंगे। हालांकि जब http के संदर्भ में चलाया जाता है, तो यह शरीर में क्रमबद्ध ऑब्जेक्ट को लौटा देगा, लेकिन आपको संसाधन के लिंक के साथ प्रतिक्रिया में एक हेडर देखना चाहिए। BTW अगर आपको लगता है कि मैंने सवाल का जवाब दिया, तो क्या आप जवाब के रूप में चिह्नित कर सकते हैं? चीयर्स।
तेज

3
धन्यवाद, यह मेरे सवाल का जवाब देता है।
मार्शल

2
आपके द्वारा आपूर्ति किया गया मार्ग प्रतिक्रिया में स्थान शीर्षलेख के रूप में दिखाई देता है। यह काफी विशिष्ट REST व्यवहार है
जेफ मार्टिन

4
@seesharper जब MyObject को BUT नहीं लौटाया गया है ... तो मुझे इसे CreatedAtvoute को कैसे पास करना है? इसके साथ क्या तरीका है?
एलिजाबेथ

6
क्या वर्तमान मार्ग का उपयोग करने का कोई तरीका है? उदाहरण के लिए, यदि मैं नियंत्रक का उपयोग करके फाइल कंट्रोलर में ऑब्जेक्ट बनाता हूं, तो मैं [Route("[controller]")]क्या लौटाऊंगा (ताकि आसन्न जीईटी कार्रवाई को यूआरएल के साथ लागू किया जा सके, उदाहरण के लिए)?
शिम्मी वेइटहैंडलर

17

जब आप CreatedAtRoute का उपयोग करते हैं, तो पहला तर्क संसाधन प्राप्त करने की विधि का नाम है। जो ट्रिक इतनी स्पष्ट नहीं है, वह यह है कि, निर्दिष्ट विधि नाम के साथ भी, आपको काम करने के लिए HttpGet विशेषता पर नाम परम का उपयोग करना चाहिए।

तो अगर आपकी पोस्ट में वापसी यह है:

return CreatedAtRoute("Get", new { newModel.Id}, newModel);

तब आपकी गेट मेथड की विशेषता इस तरह दिखनी चाहिए, भले ही आपकी विधि का नाम गेट हो:

[HttpGet("{id}", Name = "Get")]

आपकी पोस्ट पद्धति के लिए कॉल न केवल नई ऑब्जेक्ट (सामान्य रूप से JSON) लौटाएगी, यह उस संसाधन को प्राप्त होने वाले URI की प्रतिक्रिया पर स्थान शीर्षलेख सेट करेगा।


"यह न केवल नई वस्तु (सामान्य रूप से JSON) लौटाएगा, यह URI की प्रतिक्रिया पर स्थान शीर्षलेख सेट करेगा जो उस संसाधन को प्राप्त करेगा।" "यह" से, क्या आपका मतलब है HttpGet या HttpPost? इसके अलावा, आपको क्या मतलब है "यह उस संसाधन को प्राप्त करने वाले यूआरआई की प्रतिक्रिया पर स्थान हेडर सेट करेगा?"
ट्रान अन्ह मिन्ह

"यह" HttpPost विधि (उत्तर को संपादित करें) का जिक्र था। स्थान हेडर के संबंध में आपके प्रश्न के अनुसार, यह एक Http हैडर है जो क्लाइंट कुछ ऐसा करने का निर्णय ले सकता है जैसे कि स्वचालित रूप से इसे रीडायरेक्ट किया जाए। यह एक मानक Http रिस्पॉन्स हैडर ( en.wikipedia.org/wiki/… ) है।
स्कॉट ब्लेसिंगम

कृपया 2 और 3 के अर्थ को शामिल करने के लिए अपने उत्तर को अपडेट कर सकते हैं।
चर

0

नेट कोर वेबएपीआई में, आप 201 कोड को वापस करने के लिए इस पद्धति का उपयोग करते हैं, जिसका अर्थ है कि ऑब्जेक्ट बनाया गया था।

[Microsoft.AspNetCore.Mvc.NonAction]
public virtual Microsoft.AspNetCore.Mvc.CreatedAtRouteResult CreatedAtRoute (string routeName, object routeValues, object content);

जैसा कि आप ऊपर देख सकते हैं, CreatedAtRoute 3 पैरामीटर प्राप्त कर सकता है:

मार्गनाम वह नाम है जिसे आपको उस विधि पर रखना होगा जो यूआरआई होगा जो उस संसाधन को बनाने के बाद प्राप्त करेगा।

pathValues यह वह मान है जिसमें नामित मार्ग पर GET विधि को पारित किया जाएगा। इसका उपयोग निर्मित वस्तु को वापस करने के लिए किया जाएगा

सामग्री यह वह वस्तु है जिसे बनाया गया था।

उपरोक्त उदाहरण एक सरल GET विधि के साथ एक सरल नियंत्रक के दो तरीकों के कार्यान्वयन को बंधुआ नाम और POST विधि के साथ बताता है जो एक नई वस्तु बनाता है।

namespace BastterAPI.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class CompanyController : Controller
    {
        private ICompanyRepository _companyRepository;

        public CompanyController(ICompanyRepository companyRepository)
        {
            _companyRepository = companyRepository;
        }

        [HttpGet("{id}", Name="GetCompany")]
        public IActionResult GetById(int id)
        {
            Company company = _companyRepository.Find(id);

            if (company == null)
            {
                return NotFound();
            }

            return new ObjectResult(company);

        }

        [HttpPost]
        public IActionResult Create([FromBody] Company company)
        {

            if (company == null)
            {
                return BadRequest();
            }

            _companyRepository.Add(company);

            return CreatedAtRoute("GetCompany", new Company { CompanyID = company.CompanyID }, company);

        }


    }
}

जरूरी

  1. ध्यान दें कि CreatedAtRoute (pathName) पर पहला पैरामीटर, गेट मेथड में नाम की परिभाषा पर समान होना चाहिए।

  2. दूसरे पैरामीटर पर ऑब्जेक्ट के लिए आवश्यक फ़ील्ड होनी चाहिए जिसका उपयोग आप Get विधि पर संसाधन को पुनः प्राप्त करने के लिए करते हैं, आप कह सकते हैं कि यह ऑब्जेक्ट का एक सबसेट है जो स्वयं बनाया गया है

  3. अंतिम पैरामीटर यह है कि कंपनी का अनुरोध पूर्ण रूप में निकाय अनुरोध में प्राप्त होता है।

अंत में

अंतिम परिणाम के रूप में, जब पोस्ट एक नई कंपनी बनाने के लिए इस एपीआई के लिए बनाई गई है, तो आप 'एपीआई / कंपनी / {आईडी} जैसे एक मार्ग को वापस कर देंगे जो आपके लिए नए बनाए गए संसाधन पर लौटेगा

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