در C# و .NET، کلاس HttpClient یکی از ابزارهای اصلی برای ارسال درخواستهای HTTP و دریافت پاسخها از سرورها است. وقتی میخواهید از برنامه خود با یک وبسرویس (API) یا یک وبسایت ارتباط برقرار کنید، HttpClient به شما این امکان را میدهد.
ویژگیهای مهم HttpClient
ارسال درخواستها: GET, POST, PUT, DELETE و غیره.
دریافت پاسخها: شامل محتوای HTML، JSON، XML یا فایلها.
پشتیبانی از async/await: عملیات شبکه به صورت غیرهمزمان انجام میشود و برنامه بلوکه نمیشود.
مدیریت هدرها و کوکیها: امکان شخصیسازی درخواستها و مدیریت زمانبندی.
1️⃣ استفاده مستقیم از HttpClient
public class PostsController : ControllerBase { [HttpGet] public async Task<IActionResult> GetAll() { using (var client = new HttpClient()) { client.BaseAddress = new Uri("https://jsonplaceholder.typicode.com/"); var result = await client.GetStringAsync("/posts"); var finalResult = JsonConvert.DeserializeObject<List<Post>>(result); return Ok(finalResult); } } }
✅ مزیت: ساده و مستقیم
⚠️ نکته: ایجاد HttpClient در هر درخواست میتواند منابع را هدر دهد و باعث مشکلات اتصال شود.
2️⃣ استفاده از Named Client
در Program.cs:
builder.Services.AddHttpClient("posts", client => { client.BaseAddress = new Uri("https://jsonplaceholder.typicode.com/"); });
در کنترلر:
public class PostsController : ControllerBase { private readonly IHttpClientFactory _httpClientFactory; public PostsController(IHttpClientFactory httpClientFactory) { _httpClientFactory = httpClientFactory; } [HttpGet] public async Task<IActionResult> GetAll() { using (var client = _httpClientFactory.CreateClient("posts")) { var result = await client.GetStringAsync("/posts"); var finalResult = JsonConvert.DeserializeObject<List<Post>>(result); return Ok(finalResult); } } }
✅ مزیت: مدیریت بهتر منابع و قابلیت استفاده مجدد از HttpClient
3️⃣ استفاده از Typed Client
در Program.cs:
builder.Services.AddHttpClient<PostService>() .AddHttpMessageHandler<LogHttpRequest>();
ایجاد کلاس PostService:
public class PostService { private readonly HttpClient _httpClient; public PostService(HttpClient httpClient) { _httpClient = httpClient; _httpClient.BaseAddress = new Uri("https://jsonplaceholder.typicode.com/"); } public async Task<List<Post>> GetAll() { var stringResult = await _httpClient.GetStringAsync("/posts"); return JsonConvert.DeserializeObject<List<Post>>(stringResult); } }
در کنترلر:
public class PostsTypedController : ControllerBase { private readonly PostService _postService; public PostsTypedController(PostService postService) { _postService = postService; } [HttpGet] public async Task<IActionResult> GetAll() { return Ok(await _postService.GetAll()); } }
✅ مزیت: جداسازی منطق HTTP و سرویسدهی، قابلیت تست و نگهداری بهتر.
💡 جمعبندی:
برای پروژههای کوچک و سریع، استفاده مستقیم کافی است.
برای پروژههای بزرگ و مقیاسپذیر، بهتر است از Named یا Typed Client استفاده کنید تا مدیریت منابع و نگهداری آسانتر شود.