চমৎকার! গত লেকচারে আমরা Web API প্রজেক্ট সেটআপ করা শিখেছি। আজ আমরা শিখবো Web API Controller কীভাবে কাজ করে এবং এটি MVC Controller থেকে ঠিক কোথায় এবং কেন আলাদা। আজকের লেকচারটি খুবই গুরুত্বপূর্ণ, কারণ এটি আপনাকে API এর কোর আর্কিটেকচার বুঝতে সাহায্য করবে।

চলুন শুরু করা যাক!


📝 Lecture Summary

ভবিষ্যতে দ্রুত রিভিশন দেওয়ার জন্য পুরো লেকচারের মূল বিষয়গুলো নিচে তালিকাভুক্ত করা হলো:

  • Base Class: Web API Controller গুলো ControllerBase ক্লাস থেকে ইনহেরিট (inherit) করে, যেখানে MVC Controller গুলো Controller ক্লাস থেকে ইনহেরিট করে।
  • No Views Return: Web API Controller থেকে কখনোই View() রিটার্ন করা হয় না। এটি শুধু Data (String, JSON, XML ইত্যাদি) রিটার্ন করে।
  • [ApiController] Attribute: সব Web API Controller-এর উপরে এই Attribute-টি থাকতে হয়। এটি স্বয়ংক্রিয়ভাবে বেশ কিছু কাজ করে (যেমন: Model Validation Error হলে অটোমেটিক 400 Bad Request পাঠানো)।
  • Attribute Routing Mandatory: API Controller-এ কাজ করার জন্য অবশ্যই [Route("...")] অ্যাট্রিবিউট ব্যবহার করতে হয়। সাধারণত এটি [Route("api/[controller]")] ফরম্যাটে লেখা হয়।
  • Method Names: Action Method-গুলোর নামের শুরুতে HTTP Verbs (যেমন: Get, Post, Put, Delete) দেওয়া ভালো প্র্যাকটিস, অথবা explicitly [HttpGet], [HttpPost] অ্যাট্রিবিউট ব্যবহার করতে হবে।
  • Setup Default URL: launchSettings.json ফাইলে launchUrl পরিবর্তন করে আমরা আমাদের নতুন Controller-এর পাথ সেট করতে পারি (যেমন: api/test)।

🧠 Comprehensive Breakdown

নিচে লেকচারের প্রতিটি কনসেপ্ট বিস্তারিত এবং সহজভাবে ব্যাখ্যা করা হলো।

১. The Base Class: ControllerBase vs Controller (Importance: 10/10)

MVC প্রজেক্টে আমরা কন্ট্রোলার বানানোর সময় Controller ক্লাস ইনহেরিট করতাম। কিন্তু Web API-তে আমরা ইনহেরিট করি ControllerBase

Why? যদি আমরা Controller ক্লাসের ভেতরের কোড দেখি, তাহলে দেখবো Controller ক্লাসটি মূলত ControllerBase থেকেই ইনহেরিট করা। তবে Controller ক্লাসে View সম্পর্কিত অনেক অতিরিক্ত প্রপার্টি এবং মেথড থাকে (যেমন: ViewBag, ViewData, TempData, View(), PartialView())। যেহেতু Web API-তে আমাদের কোনো View (UI) দরকার নেই, তাই শুধু শুধু মেমরি খরচ করে Controller ক্লাস ব্যবহার করাটা বোকামি। এর বদলে আমরা হালকা এবং অপ্টিমাইজড ControllerBase ক্লাস ব্যবহার করি, যেখানে শুধু API-এর জন্য প্রয়োজনীয় প্রপার্টিগুলো থাকে।

২. The [ApiController] Attribute (Importance: 10/10)

Web API Controller ক্লাসের ঠিক ওপরে [ApiController] অ্যাট্রিবিউটটি লেখা বাধ্যতামূলক।

Why? এই অ্যাট্রিবিউটটি API-কে আরও স্মার্ট করে তোলে:

  1. Attribute Routing Requirement: এটি বাধ্য করে যে কন্ট্রোলারের ওপরে অবশ্যই একটি [Route] অ্যাট্রিবিউট থাকতে হবে।
  2. Automatic 400 Bad Request: Model Validation-এ কোনো ভুল থাকলে (যেমন: required field ফাঁকা থাকলে) আগে আমাদের if(!ModelState.IsValid) return BadRequest(); লিখতে হতো। কিন্তু [ApiController] থাকলে ফ্রেমওয়ার্ক নিজে থেকেই এটি চেক করে এবং ভুল পেলে অটোমেটিক 400 Bad Request রেসপন্স পাঠিয়ে দেয়।

৩. Attribute Routing (Importance: 9/10)

Web API Controller-এর ওপরে রাউটিং ডিফাইন করা হয় [Route("api/[controller]")] লিখে।

  • এখানে "api/" হলো একটি প্রিফিক্স (prefix)। এটি দেওয়া বাধ্যতামূলক নয়, তবে এটি একটি কমন স্ট্যান্ডার্ড যাতে URL দেখেই বোঝা যায় এটি একটি API কল।
  • [controller] হলো একটি প্লেসহোল্ডার। আপনি যদি কন্ট্রোলারের নাম TestController দেন, তাহলে এটি স্বয়ংক্রিয়ভাবে api/test রাউট তৈরি করে নেবে।

৪. Creating the First API Controller and Action Method (Importance: 8/10)

ভিডিওতে দেখানো হয়েছে কীভাবে ডিফল্ট Controller ডিলিট করে নতুন একটি TestController তৈরি করতে হয় এবং একটি সিম্পল GET রিকোয়েস্ট হ্যান্ডেল করতে হয়।

Why Explicit Attributes? যদিও মেথডের নাম Get দিয়ে শুরু করলে ASP.NET Core স্বয়ংক্রিয়ভাবে বুঝে নেয় এটি একটি GET রিকোয়েস্ট, তবুও বেস্ট প্র্যাকটিস হলো মেথডের ওপরে explicitly [HttpGet] অ্যাট্রিবিউট ব্যবহার করা। এতে কোড রিডেবিলিটি বাড়ে।

৫. Updating launchSettings.json (Importance: 6/10)

যেহেতু আমরা আগের ডিফল্ট WeatherForecastController ডিলিট করে দিয়েছি, তাই প্রজেক্ট রান করলে যেন 404 Error না আসে, সেজন্য launchSettings.json ফাইলে গিয়ে launchUrl প্রপার্টিটি "api/test" করে দিতে হবে।


💻 Code Implementation

নিচে একটি সিম্পল এবং ক্লিন Web API Controller-এর উদাহরণ দেওয়া হলো, যা লেকচারে দেখানো হয়েছে:

using Microsoft.AspNetCore.Mvc;
 
namespace CitiesManager.WebApi.Controllers
{
    // ১. ApiController Attribute
    [ApiController] 
    
    // ২. Attribute Routing (e.g., URL will be /api/test)
    [Route("api/[controller]")] 
    
    // ৩. Inheriting from ControllerBase
    public class TestController : ControllerBase 
    {
        // ৪. Explicit HTTP Verb Attribute
        [HttpGet] 
        public string GetTestMessage()
        {
            // Web API returns data, NOT views
            return "Hello World from Web API!"; 
        }
    }
}
 

🏆 Best Practices for API Controllers

  • Always use ControllerBase: কখনো ভুলে Controller ইনহেরিট করবেন না, এটি API এর জন্য ব্যাড প্র্যাকটিস এবং রিসোর্স অপচয়।
  • Explicit HTTP Verbs: মেথডের নামের ওপর নির্ভর না করে সবসময় [HttpGet], [HttpPost], [HttpPut], [HttpDelete] অ্যাট্রিবিউটগুলো ব্যবহার করুন।
  • Use “api/” Prefix: রাউটিংয়ের সময় [Route("api/[controller]")] ব্যবহার করা একটি গ্লোবাল স্ট্যান্ডার্ড।
  • Return Typed Results: শুধু String বা Object রিটার্ন না করে IActionResult বা ActionResult<T> রিটার্ন করার চেষ্টা করুন। এতে কোড আরো ফ্লেক্সিবল হয় (যা আমরা সামনের লেকচারগুলোতে শিখবো)।

আপনি क्या API Controller এবং MVC Controller এর মূল পার্থক্যগুলো পরিষ্কারভাবে বুঝতে পেরেছেন? সামনের লেকচারে আমরা সরাসরি Entity Framework Core ব্যবহার করে ডাটাবেজ থেকে ডেটা নিয়ে আসবো!