হ্যালো! আমি আপনার “Simple Coding Tutor”। আপনার দেওয়া লেকচার ট্র্যান্সক্রিপ্টটি ASP.NET Core-এ HttpClient (Part 2) (লেকচার ১৬০) নিয়ে আলোচনা করেছে। এখানে মূলত একটি রিয়েল-ওয়ার্ল্ড API (finnhub.io) থেকে ডেটা রিড করার প্র্যাকটিক্যাল উদাহরণ দেখানো হয়েছে। চলুন, পুরো বিষয়টি বিস্তারিতভাবে শিখে নেওয়া যাক।
📝 সারসংক্ষেপ (Quick Summary for Revision)
ভবিষ্যতে দ্রুত রিভিশন দেওয়ার জন্য মূল পয়েন্টগুলো নিচে লিস্ট করা হলো:
- Real-World API:
finnhub.ioওয়েবসাইট থেকে U.S. স্টক মার্কেটের রিয়েল-টাইম ডেটা রিড করার জন্য একটি ফ্রি API Key (Token) সংগ্রহ করা হয়েছে। - API Documentation: যেকোনো থার্ড-পার্টি API ব্যবহার করার আগে তাদের ডকুমেন্টেশন পড়া জরুরি (যেমন: URL স্ট্রাকচার, প্যারামিটার, রেসপন্স ফরম্যাট)।
- Query String: API-তে রিকোয়েস্ট পাঠানোর সময়
?দিয়ে query string শুরু হয়। এখানেsymbol(যেমন: AAPL, MSFT) এবংtoken(API Key) পাস করা হয়েছে। - Reading Response Body: HTTP Response থেকে ডেটা পড়ার জন্য
response.Contentব্যবহার করা হয়। লেকচারেReadAsStreamAsyncএবংStreamReaderব্যবহার করে JSON ডেটা string হিসেবে পড়া হয়েছে। - Service Dependency:
HomeController-এ DI (Dependency Injection) এর মাধ্যমেMyServiceইনজেক্ট করে API কল করা হয়েছে।
🧠 Comprehensive Breakdown
১. API Key সংগ্রহ করা এবং Documentation পড়া [Priority: 10/10]
আপনি যখনই কোনো এক্সটার্নাল সার্ভিস (যেমন: Weather, Stock, Payment) ব্যবহার করবেন, তখন তাদের কাছে নিজেকে পরিচয় করিয়ে দেওয়ার জন্য একটি API Key বা Token প্রয়োজন হয়।
finnhub.ioওয়েবসাইটে রেজিস্ট্রেশন করে একটি ফ্রি টোকেন নেওয়া হয়েছে।- এরপর তাদের Documentation চেক করে দেখা হয়েছে কীভাবে রিকোয়েস্ট পাঠাতে হবে।
- Target URL:
https://finnhub.io/api/v1/quote?symbol=MSFT&token=your_api_key_here /v1/: এটি API-এর ভার্সন। ভবিষ্যতে তারা /v2/ আনতে পারে।quote: এটি স্পেসিফিক সার্ভিসের নাম (স্টক প্রাইস জানার জন্য)।?symbol=MSFT: কোন কোম্পানির স্টক দেখতে চান (যেমন MSFT = Microsoft, AAPL = Apple)।&token=...: আপনার সিক্রেট API Key।
২. HttpClient দিয়ে Request পাঠানো এবং Response পড়া [Priority: 10/10]
গত লেকচারে আমরা শুধু রিকোয়েস্ট পাঠিয়েছিলাম। এই লেকচারে আমরা সেই রিকোয়েস্টের Response Body (JSON ডেটা) পড়ব।
Code Implementation (MyService.cs):
using System.IO;
using System.Net.Http;
using System.Threading.Tasks;
public class MyService
{
private readonly IHttpClientFactory _httpClientFactory;
public MyService(IHttpClientFactory httpClientFactory)
{
_httpClientFactory = httpClientFactory;
}
public async Task GetExternalDataAsync()
{
using (HttpClient httpClient = _httpClientFactory.CreateClient())
{
// 1. Request তৈরি করা (Query String এ token এবং symbol পাঠানো হয়েছে)
HttpRequestMessage request = new HttpRequestMessage()
{
RequestUri = new Uri("https://finnhub.io/api/v1/quote?symbol=MSFT&token=আপনার_টোকেন"),
Method = HttpMethod.Get
};
// 2. Request পাঠানো এবং Response রিসিভ করা
HttpResponseMessage response = await httpClient.SendAsync(request);
// 3. Response থেকে Content (Body) Stream হিসেবে পড়া
Stream stream = await response.Content.ReadAsStreamAsync();
// 4. StreamReader ব্যবহার করে Stream কে String এ কনভার্ট করা
using (StreamReader reader = new StreamReader(stream))
{
string responseString = reader.ReadToEnd();
// এখানে responseString হবে একটি JSON যেমন: {"c":272.5,"h":275.2,"l":269.8,...}
// (c=Current, h=High, l=Low price)
}
}
}
}
Note: লেকচারার এখানে StreamReader ব্যবহার করে দেখিয়েছেন কীভাবে নিচ-স্তর (low-level) থেকে ডেটা পড়া যায়। তবে .NET-এ এর চেয়েও সহজ উপায় আছে (যা Best Practices অংশে দেওয়া হলো)।
৩. Controller-এ Service Inject করা [Priority: 8/10]
সার্ভিসটি তৈরি করার পর, এটিকে Program.cs-এ রেজিস্টার করতে হবে এবং তারপর Controller-এ ইনজেক্ট করে কল করতে হবে।
Code Implementation:
// Program.cs এ সার্ভিস রেজিস্টার করা
builder.Services.AddScoped<MyService>();
// HomeController.cs
public class HomeController : Controller
{
private readonly MyService _myService;
// Constructor Injection
public HomeController(MyService myService)
{
_myService = myService;
}
[HttpGet]
public async Task<IActionResult> Index()
{
// সার্ভিস কল করা
await _myService.GetExternalDataAsync();
return View();
}
}
💡 Best Practices & .NET 10 Context
লেকচারে Stream এবং StreamReader ব্যবহার করে JSON ডেটাকে string হিসেবে রিড করা হয়েছে। এটি অনেক পুরনো পদ্ধতি। আধুনিক C# এবং .NET 10-এ JSON ডেটা রিড করা এবং Deserialize করা (C# Object-এ কনভার্ট করা) অনেক বেশি সহজ এবং ফাস্ট।
- ReadAsStringAsync() ব্যবহার করা (Simple Method):
StreamReaderব্যবহার করার কোনো প্রয়োজন নেই।HttpClientএর সাথেই string হিসেবে পড়ার মেথড দেওয়া আছে।
// Much simpler way!
string responseString = await response.Content.ReadAsStringAsync();
- System.Text.Json ব্যবহার করে সরাসরি Deserialize করা (.NET 8/10 Best Practice):
JSON string পড়ে ম্যানুয়ালি কাজ করার চেয়ে, সরাসরি JSON কে C# ক্লাসে কনভার্ট করা সবচেয়ে ভালো পদ্ধতি। .NET 8/10-এ
GetFromJsonAsync<T>মেথডটি খুবই পপুলার। Modern .NET 10 Implementation:
// প্রথমে JSON এর সাথে মিল রেখে একটি C# Model তৈরি করুন
public class StockQuoteResponse
{
[JsonPropertyName("c")] // JSON এর "c" প্রপার্টিকে C# এর CurrentPrice এ ম্যাপ করবে
public double CurrentPrice { get; set; }
[JsonPropertyName("h")]
public double HighPrice { get; set; }
}
// MyService.cs এর আধুনিক ভার্সন
public async Task<StockQuoteResponse> GetStockDataAsync()
{
using (HttpClient httpClient = _httpClientFactory.CreateClient())
{
// মাত্র এক লাইনে রিকোয়েস্ট পাঠানো এবং JSON কে C# অবজেক্টে কনভার্ট করা!
var result = await httpClient.GetFromJsonAsync<StockQuoteResponse>(
"https://finnhub.io/api/v1/quote?symbol=MSFT&token=আপনার_টোকেন");
return result;
}
}
এই পদ্ধতিতে আপনার কোড হবে মাত্র কয়েক লাইনের এবং পারফরম্যান্সও হবে চমৎকার।
3. API Key Security: লেকচারে টোকেনটি সরাসরি URL-এর ভেতর হার্ডকোড করা হয়েছে। রিয়েল প্রজেক্টে কখনোই API Key কোডের ভেতর হার্ডকোড করবেন না। এগুলো appsettings.json, Secret Manager বা Azure Key Vault থেকে রিড করে ব্যবহার করতে হবে। (যা পূর্বের লেকচারগুলোতে আলোচনা করা হয়েছে)।