एक के साथ सबसे बुनियादी संस्करण प्रतिक्रिया JsonResult
है:
// GET: api/authors
[HttpGet]
public JsonResult Get()
{
return Json(_authorRepository.List());
}
हालाँकि, यह आपके मुद्दे के साथ मदद करने के लिए नहीं जा रहा है क्योंकि आप स्पष्ट रूप से अपने स्वयं के प्रतिक्रिया कोड से निपट नहीं सकते हैं।
स्थिति के परिणामों पर नियंत्रण पाने का तरीका, क्या आपको ऐसा करने की आवश्यकता ActionResult
है, जहां आप फिर StatusCodeResult
प्रकार का लाभ उठा सकें ।
उदाहरण के लिए:
// GET: api/authors/search?namelike=foo
[HttpGet("Search")]
public IActionResult Search(string namelike)
{
var result = _authorRepository.GetByNameSubstring(namelike);
if (!result.Any())
{
return NotFound(namelike);
}
return Ok(result);
}
नोट इन दोनों उपरोक्त उदाहरण Microsoft दस्तावेज़ीकरण से उपलब्ध एक महान मार्गदर्शिका से आए थे: स्वरूपण प्रतिक्रिया डेटा
अतिरिक्त सामान
यह मुद्दा मुझे अक्सर आता है कि मैं अपने वेबएपीआई पर अधिक दानेदार नियंत्रण चाहता था बजाय वीएस में "न्यू प्रोजेक्ट" टेम्पलेट से चूक विन्यास के।
चलो सुनिश्चित करें कि आपके पास कुछ मूल बातें हैं ...
चरण 1: अपनी सेवा को कॉन्फ़िगर करें
स्थिति कोड के पूर्ण नियंत्रण के साथ एक JSON सीरियलाइज्ड ऑब्जेक्ट के साथ प्रतिक्रिया करने के लिए अपने ASP.NET कोर वेबएपीआई को प्राप्त करने के लिए, आपको यह सुनिश्चित करके शुरू करना चाहिए कि आपने आमतौर पर पाई जाने वाली AddMvc()
अपनी ConfigureServices
विधि में सेवा को शामिल किया है Startup.cs
।
यह ध्यान रखना महत्वपूर्ण है कि AddMvc()
अन्य अनुरोध प्रकारों का जवाब देने के साथ ही JSON के लिए इनपुट / आउटपुट फॉर्मेटर स्वचालित रूप से शामिल होगा।
यदि आपके प्रोजेक्ट को पूर्ण नियंत्रण की आवश्यकता है और आप अपनी सेवाओं को कड़ाई से परिभाषित करना चाहते हैं, जैसे कि आपका WebAPI विभिन्न अनुरोध प्रकारों के साथ कैसे व्यवहार करेगा application/json
और अन्य अनुरोध प्रकारों (जैसे एक मानक ब्राउज़र अनुरोध) का जवाब नहीं देता है, तो आप इसे मैन्युअल रूप से परिभाषित कर सकते हैं। निम्नलिखित कोड:
public void ConfigureServices(IServiceCollection services)
{
// Build a customized MVC implementation, without using the default AddMvc(), instead use AddMvcCore().
// https://github.com/aspnet/Mvc/blob/dev/src/Microsoft.AspNetCore.Mvc/MvcServiceCollectionExtensions.cs
services
.AddMvcCore(options =>
{
options.RequireHttpsPermanent = true; // does not affect api requests
options.RespectBrowserAcceptHeader = true; // false by default
//options.OutputFormatters.RemoveType<HttpNoContentOutputFormatter>();
//remove these two below, but added so you know where to place them...
options.OutputFormatters.Add(new YourCustomOutputFormatter());
options.InputFormatters.Add(new YourCustomInputFormatter());
})
//.AddApiExplorer()
//.AddAuthorization()
.AddFormatterMappings()
//.AddCacheTagHelper()
//.AddDataAnnotations()
//.AddCors()
.AddJsonFormatters(); // JSON, or you can build your own custom one (above)
}
आप देखेंगे कि मैंने आपके लिए अपने स्वयं के कस्टम इनपुट / आउटपुट फॉर्मेटर्स को जोड़ने का एक तरीका भी शामिल किया है, इस घटना में आप एक और क्रमांकन प्रारूप (प्रोटोबॉफ़, थ्रिफ्ट, आदि) का जवाब देना चाह सकते हैं।
ऊपर दिए गए कोड का हिस्सा अधिकतर AddMvc()
विधि का डुप्लिकेट है । हालाँकि, हम टेम्पलेट के साथ पूर्व-प्रेषित एक के साथ जाने के बजाय प्रत्येक और प्रत्येक सेवा को परिभाषित करके अपने दम पर प्रत्येक "डिफ़ॉल्ट" सेवा को लागू कर रहे हैं। मैंने कोड ब्लॉक में रिपॉजिटरी लिंक जोड़ा है, या आप AddMvc()
GitHub रिपॉजिटरी से जांच कर सकते हैं । ।
ध्यान दें कि कुछ मार्गदर्शिकाएँ हैं जो इसे डिफ़ॉल्ट रूप से "पूर्ववत" करके इसे हल करने का प्रयास करेंगे, न कि इसे केवल पहली जगह पर लागू नहीं करने के लिए ... यदि आप इसमें कारक हैं कि अब हम ओपन सोर्स के साथ काम कर रहे हैं, तो यह निरर्थक काम है , बुरा कोड और स्पष्ट रूप से एक पुरानी आदत है जो जल्द ही गायब हो जाएगी।
चरण 2: एक नियंत्रक बनाएं
मैं आपको अपना प्रश्न हल करने के लिए वास्तव में सीधे-सीधे एक दिखाने जा रहा हूं।
public class FooController
{
[HttpPost]
public async Task<IActionResult> Create([FromBody] Object item)
{
if (item == null) return BadRequest();
var newItem = new Object(); // create the object to return
if (newItem != null) return Ok(newItem);
else return NotFound();
}
}
चरण 3: अपनी जाँच करें Content-Type
औरAccept
आपको यह सुनिश्चित करने की आवश्यकता है कि आपके अनुरोध में आपके Content-Type
और Accept
हेडर ठीक से सेट हैं। आपके मामले में (JSON), आप इसे स्थापित करना चाहेंगेapplication/json
।
यदि आप चाहते हैं कि आपका WebAPI JSON के रूप में डिफ़ॉल्ट रूप से प्रतिक्रिया दे, तो चाहे जो अनुरोध हेडर निर्दिष्ट कर रहा हो वह आपको कुछ तरीकों से कर सकता है ।
मार्ग 1
जैसा कि मैंने पहले सुझाए गए लेख में दिखाया था ( स्वरूपण प्रतिक्रिया डेटा ) आप नियंत्रक / क्रिया स्तर पर किसी विशेष प्रारूप को बाध्य कर सकते हैं। मुझे व्यक्तिगत रूप से यह तरीका पसंद नहीं है ... लेकिन यहाँ यह पूर्णता के लिए है:
एक विशेष प्रारूप के लिए बाध्य करना यदि आप किसी विशिष्ट क्रिया के लिए प्रतिक्रिया स्वरूपों को प्रतिबंधित करना चाहते हैं, तो आप [प्रोड्यूस] फ़िल्टर लागू कर सकते हैं। [प्रोड्यूस] फिल्टर एक विशिष्ट एक्शन (या कंट्रोलर) के लिए प्रतिक्रिया स्वरूपों को निर्दिष्ट करता है। अधिकांश फिल्टर की तरह, यह एक्शन, कंट्रोलर या ग्लोबल स्कोप पर लागू किया जा सकता है।
[Produces("application/json")]
public class AuthorsController
[Produces]
फ़िल्टर की सभी कार्यों के लिए बाध्य करेगा
AuthorsController
, JSON- प्रारूपित प्रतिक्रियाओं वापस जाने के लिए भले ही अन्य formatters आवेदन के लिए कॉन्फ़िगर किया गया और ग्राहक एक प्रदान की Accept
हैडर एक अलग, उपलब्ध प्रारूप का अनुरोध किया।
मार्ग 2
वेबएपीआई के लिए मेरा पसंदीदा तरीका सभी अनुरोधों के अनुरोध के साथ प्रतिक्रिया करना है। हालाँकि, इस घटना में कि यह अनुरोधित प्रारूप को स्वीकार नहीं करता है, फिर एक डिफ़ॉल्ट पर वापस जाएँ (जैसे। JSON)
सबसे पहले, आपको अपने विकल्पों में पंजीकरण करना होगा (हमें पहले की तरह, डिफ़ॉल्ट व्यवहार को फिर से तैयार करना होगा)
options.RespectBrowserAcceptHeader = true; // false by default
अंत में, सेवा बिल्डर में परिभाषित किए गए फॉर्मेटर्स की सूची को फिर से आदेश देने से, वेब होस्ट सूची के शीर्ष पर आपके द्वारा तैयार किए गए फॉर्मैटर पर डिफ़ॉल्ट हो जाएगा (अर्थात स्थिति 0)।
अधिक जानकारी इस .NET वेब डेवलपमेंट और टूल्स ब्लॉग प्रविष्टि में पाई जा सकती है
CreatedAtRoute
विधि आदि का उपयोग करते हैं