এর সাথে সাড়া দেওয়ার সবচেয়ে প্রাথমিক সংস্করণটি 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);
}
নোট করুন উপরের এই দুটি উদাহরণই মাইক্রোসফ্ট ডকুমেন্টেশন: ফরম্যাটিং রেসপন্স ডেটা থেকে প্রাপ্ত একটি দুর্দান্ত গাইড থেকে এসেছে
অতিরিক্ত স্টাফ
আমি যে সমস্যাটি প্রায়শই দেখতে পাই তা হ'ল আমি ভিএসএর "নতুন প্রকল্প" টেমপ্লেট থেকে ডিফল্ট কনফিগারেশনটি না গিয়ে আমার ওয়েবএপিআইয়ের উপর আরও গ্রানুলার নিয়ন্ত্রণ চেয়েছিলাম
আসুন নিশ্চিত হয়ে নিন যে আপনার কয়েকটি বেসিক নীচে রয়েছে ...
পদক্ষেপ 1: আপনার পরিষেবা কনফিগার করুন
আপনার এএসপি.নেট কোর ওয়েবএপিআইকে স্থিতির কোডের সম্পূর্ণ নিয়ন্ত্রণের সাথে একটি জেএসওএন সিরিয়ালাইজড অবজেক্টের সাথে প্রতিক্রিয়া জানানোর জন্য, আপনাকে সাধারণত যে পদ্ধতিতে পাওয়া গেছে সে পদ্ধতিতে AddMvc()
আপনি পরিষেবাটি অন্তর্ভুক্ত করেছেন তা নিশ্চিত করে আপনার শুরু করা উচিত ।ConfigureServices
Startup.cs
এটি জেনে রাখা গুরুত্বপূর্ণ যে AddMvc()
জেএসএনের জন্য অন্যান্য অনুরোধের ধরণের সাড়া দেওয়ার সাথে সাথে স্বয়ংক্রিয়ভাবে ইনপুট / আউটপুট ফর্ম্যাটার অন্তর্ভুক্ত থাকবে।
যদি আপনার প্রকল্পের সম্পূর্ণ নিয়ন্ত্রণের প্রয়োজন হয় এবং আপনি আপনার পরিষেবাদিগুলি কঠোরভাবে সংজ্ঞায়িত করতে চান যেমন আপনার ওয়েবএপিআই 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()
গিটহাব সংগ্রহস্থল থেকে চেক আউট করতে পারেন । ।
মনে রাখবেন যে এমন কিছু গাইড রয়েছে যা ডিফল্টগুলি "পূর্বাবস্থায়" ফেলে প্রথমে এটি প্রয়োগ না করে সমাধান করার চেষ্টা করবে ... আপনি যদি এখন খোলার উত্সের সাথে কাজ করছেন তবে আপনি যদি এটির কারণ হন তবে এটি অপ্রয়োজনীয় কাজ , খারাপ কোড এবং সত্যই একটি পুরানো অভ্যাস যা শীঘ্রই অদৃশ্য হয়ে যাবে।
পদক্ষেপ 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
শিরোনামগুলি সঠিকভাবে সেট করা আছে তা নিশ্চিত করা দরকার । আপনার ক্ষেত্রে (জেএসএন), আপনি এটি সেট আপ করতে চাইবেন ।application/json
যদি আপনি চান যে আপনার ওয়েবএপিআই যদি ডিএসএল হিসাবে JSON হিসাবে প্রতিক্রিয়া জানায় তবে অনুরোধ শিরোনামটি যা নির্দিষ্ট করে তা আপনি দু'ভাবে উপায়ে করতে পারেন তা নির্বিশেষে ।
উপায় 1
আমি পূর্বে প্রস্তাবিত নিবন্ধে প্রদর্শিত ( রেসপন্স ডেটা ফর্ম্যাট করা) আপনি নিয়ামক / ক্রিয়া স্তরে কোনও নির্দিষ্ট বিন্যাসকে বাধ্য করতে পারেন। আমি ব্যক্তিগতভাবে এই পদ্ধতির পছন্দ করি না ... তবে এখানে এটি সম্পূর্ণতার জন্য:
একটি বিশেষ ফর্ম্যাট জোর করা যদি আপনি করতে পারেন এমন কোনও নির্দিষ্ট ক্রিয়াটির জন্য প্রতিক্রিয়া ফর্ম্যাটগুলি সীমাবদ্ধ করতে চান, আপনি [উত্পাদক] ফিল্টার প্রয়োগ করতে পারেন। [উত্পাদক] ফিল্টার একটি নির্দিষ্ট ক্রিয়া (বা নিয়ামক) এর প্রতিক্রিয়া ফর্ম্যাটগুলি নির্দিষ্ট করে। বেশিরভাগ ফিল্টারগুলির মতো এটিও অ্যাকশন, নিয়ামক বা বৈশ্বিক সুযোগে প্রয়োগ করা যেতে পারে।
[Produces("application/json")]
public class AuthorsController
[Produces]
ফিল্টার মধ্যে সমস্ত ক্রিয়া বাধ্য করা হবে
AuthorsController
, JSON- বিন্যস্ত প্রতিক্রিয়া ফিরে যাওয়ার এমনকি যদি অন্যান্য formatters অ্যাপ্লিকেশনের জন্য কনফিগার করা হয় এবং ক্লায়েন্ট একটি প্রদত্ত Accept
হেডার একটি ভিন্ন, উপলব্ধ বিন্যাস অনুরোধ করা হচ্ছে।
উপায় 2
আমার পছন্দসই পদ্ধতিটি ওয়েবএপিআই-র কাছে অনুরোধ করা ফর্ম্যাটটির সাথে সমস্ত অনুরোধের প্রতিক্রিয়া জানানো। যাইহোক, ইভেন্টটি যে এটি অনুরোধ করা ফর্ম্যাটটি গ্রহণ করে না, তারপরে একটি ডিফল্ট (যেমন JSON) এ ফিরে আসুন
প্রথমত, আপনাকে এটি আপনার বিকল্পগুলিতে নিবন্ধন করতে হবে (আমাদের পূর্বনির্ধারিত হিসাবে পূর্বনির্ধারিত আচরণটি পুনরায় কাজ করতে হবে)
options.RespectBrowserAcceptHeader = true; // false by default
পরিশেষে, সার্ভিস বিল্ডারে সংজ্ঞায়িত ফর্ম্যাটরের তালিকায় কেবলমাত্র অর্ডার দেওয়ার মাধ্যমে, ওয়েব হোস্ট তালিকার শীর্ষে অবস্থিত ফর্ম্যাটারে ডিফল্ট হয়ে যাবে (অর্থাত্ পজিশন 0)।
আরও তথ্য এটি। নেট ওয়েব বিকাশ এবং সরঞ্জাম ব্লগ এন্ট্রি পাওয়া যাবে
CreatedAtRoute
পদ্ধতি ইত্যাদি