اگر توسعهدهندهای یا که میخواهی وارد دنیای بکاند شوی، احتمالاً بارها اسم Web API به گوشت خورده. اما واقعاً Web API چیست و چرا یادگیری آن با زبان C# اینقدر مهم شده؟
به زبان ساده، Web API (Application Programming Interface) یک رابط برنامهنویسی است که به اپلیکیشنهای مختلف اجازه میدهد با یکدیگر «حرف بزنند». وقتی اپ موبایلت اطلاعات آبوهوا را نشان میدهد، وقتی فروشگاه آنلاین درگاه پرداخت را فراخوانی میکند، یا وقتی داشبورد مدیریتیات دادههای سرور را میگیرد — همه اینها از طریق Web API اتفاق میافتد.
C# و ASP.NET Core یکی از قویترین، پرسرعتترین و پرطرفدارترین ابزارها برای ساخت Web API هستند. مایکروسافت این فریمورک را کاملاً متنباز کرده و عملکرد آن در بنچمارکهای بینالمللی حرف ندارد.
قبل از شروع، باید چند مفهوم پایه را بدانی تا مسیرت هموار باشد:
وقتی از Web API با C# صحبت میکنیم، معمولاً منظورمان ساخت یک RESTful API است. REST مخفف «Representational State Transfer» است و یک سبک معماری برای طراحی سرویسهای وب است.
ترمینال را باز کن و دستور زیر را اجرا کن:
dotnet new webapi -n MyFirstAPI cd MyFirstAPI dotnet run
همین! با این سه دستور یک Web API کامل راهاندازی شد. حالا بریم سراغ ساختار پروژه.
فایل جدیدی به نام ProductsController.cs در پوشه Controllers بساز:
using Microsoft.AspNetCore.Mvc;
namespace MyFirstAPI.Controllers
{
[ApiController]
[Route(“api/[controller]”)]
public class ProductsController : ControllerBase
{
private static List _products = new List
{
new Product { Id = 1, Name = “لپتاپ”, Price = 25000000 },
new Product { Id = 2, Name = “ماوس”, Price = 500000 }
};
// GET: api/products
[HttpGet]
public ActionResult> GetAll()
{
return Ok(_products);
}
// GET: api/products/1
[HttpGet(“{id}”)]
public ActionResult GetById(int id)
{
var product = _products.FirstOrDefault(p => p.Id == id);
if (product == null)
return NotFound();
return Ok(product);
}
// POST: api/products
[HttpPost]
public ActionResult Create([FromBody] Product product)
{
product.Id = _products.Max(p => p.Id) + 1;
_products.Add(product);
return CreatedAtAction(nameof(GetById), new { id = product.Id }, product);
}
// PUT: api/products/1
[HttpPut(“{id}”)]
public IActionResult Update(int id, [FromBody] Product updated)
{
var product = _products.FirstOrDefault(p => p.Id == id);
if (product == null) return NotFound();
product.Name = updated.Name;
product.Price = updated.Price;
return NoContent();
}
// DELETE: api/products/1
[HttpDelete(“{id}”)]
public IActionResult Delete(int id)
{
var product = _products.FirstOrDefault(p => p.Id == id);
if (product == null) return NotFound();
_products.Remove(product);
return NoContent();
}
}
public class Product
{
public int Id { get; set; }
public string Name { get; set; } = string.Empty;
public decimal Price { get; set; }
}
}
در دنیای واقعی، دادهها را در لیست نگه نمیداری! باید از دیتابیس استفاده کنی. Entity Framework Core (EF Core) یک ORM قدرتمند است که کار با دیتابیس را بسیار ساده میکند.
dotnet add package Microsoft.EntityFrameworkCore.SqlServer dotnet add package Microsoft.EntityFrameworkCore.Tools
using Microsoft.EntityFrameworkCore;
public class AppDbContext : DbContext
{
public AppDbContext(DbContextOptions options)
: base(options) { }
public DbSet Products { get; set; }
}
builder.Services.AddDbContext(options => options.UseSqlServer(builder.Configuration .GetConnectionString(“DefaultConnection”)));
یکی از مهمترین بخشهای هر API حرفهای، احراز هویت (Authentication) است. استاندارد طلایی در این زمینه، استفاده از JWT (JSON Web Token) است.
dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer
// در Program.cs:
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = builder.Configuration[“Jwt:Issuer”],
ValidAudience = builder.Configuration[“Jwt:Audience”],
IssuerSigningKey = new SymmetricSecurityKey(
Encoding.UTF8.GetBytes(builder.Configuration[“Jwt:Key”]))
};
});
Swagger (OpenAPI) یکی از بهترین ابزارها برای مستندسازی خودکار API است. وقتی یک API میسازی، تیم فرانتاند باید بداند چه Endpointهایی داری. Swagger این کار را به شکل بصری و تعاملی انجام میدهد.
خبر خوب اینکه در پروژههای جدید ASP.NET Core، Swagger بهصورت پیشفرض نصب و فعال است. فقط کافی است پروژه را اجرا کنی و به آدرس /swagger بروی.
💡 نکته حرفهای
برای محیط Production، Swagger را غیرفعال کن تا اطلاعات APIات لو نرود. از متغیر محیطی ASPNETCORE_ENVIRONMENT برای تشخیص محیط استفاده کن.
درک Middleware Pipeline برای ساخت APIهای حرفهای ضروری است. هر درخواست HTTP که به سرور میرسد، از یک «خط لوله» عبور میکند. در هر نقطه میتوانی منطق خاصی اضافه کنی:
در پروژههای واقعی، نباید مستقیم از DbContext در Controller استفاده کنی. الگوی Repository لایهای انتزاعی بین منطق کسبوکار و دسترسی به داده ایجاد میکند.
// Interface
public interface IProductRepository
{
Task> GetAllAsync();
Task GetByIdAsync(int id);
Task CreateAsync(Product product);
Task UpdateAsync(Product product);
Task DeleteAsync(int id);
}
// Implementation
public class ProductRepository : IProductRepository
{
private readonly AppDbContext _context;
public ProductRepository(AppDbContext context)
{
_context = context;
}
public async Task> GetAllAsync()
{
return await _context.Products.ToListAsync();
}
// … سایر متدها
}
هرگز به دادههای ورودی کاربر اعتماد نکن! Data Validation یکی از اصول امنیتی مهم است. در ASP.NET Core میتوانی از Data Annotations استفاده کنی:
public class CreateProductDto
{
[Required(ErrorMessage = “نام محصول الزامی است”)]
[StringLength(100, MinimumLength = 2)]
public string Name { get; set; } = string.Empty;
[Required]
[Range(1000, 1000000000, ErrorMessage = “قیمت باید بین ۱۰۰۰ و ۱ میلیارد تومان باشد”)]
public decimal Price { get; set; }
[Required]
[Range(0, int.MaxValue)]
public int Stock { get; set; }
}
🚀 میخواهی کسبوکارت آنلاین رشد کند؟
آیا میخواهید سایت شما هم مثل رقبا در صفحه اول گوگل باشد و زنگخورهایتان چند برابر شود؟ سئوی سایت خود را به متخصصان ما بسپارید. همین حالا برای مشاوره رایگان با ما تماس بگیرید:
📞 09190994063 | 09376846692
یک API حرفهای باید خطاها را به شکل استاندارد و قابلفهم برگرداند. استفاده از ProblemDetails که استاندارد RFC 7807 است، توصیه میشود:
// Global Exception Handler Middleware
public class GlobalExceptionHandler : IMiddleware
{
private readonly ILogger _logger;
public GlobalExceptionHandler(ILogger logger)
{
_logger = logger;
}
public async Task InvokeAsync(HttpContext context, RequestDelegate next)
{
try
{
await next(context);
}
catch (Exception ex)
{
_logger.LogError(ex, “خطای غیرمنتظره رخ داد”);
context.Response.StatusCode = 500;
context.Response.ContentType = “application/json”;
await context.Response.WriteAsJsonAsync(new
{
error = “خطای داخلی سرور. لطفاً دوباره تلاش کنید.”,
traceId = context.TraceIdentifier
});
}
}
}
وقتی APIات رشد میکند و کلاینتهای متعددی از آن استفاده میکنند، به API Versioning نیاز داری. این کار باعث میشود بدون شکستن کلاینتهای قدیمی، APIت را ارتقاء بدهی:
dotnet add package Asp.Versioning.Mvc
// در Program.cs:
builder.Services.AddApiVersioning(options =>
{
options.DefaultApiVersion = new ApiVersion(1, 0);
options.AssumeDefaultVersionWhenUnspecified = true;
options.ReportApiVersions = true;
});
// در Controller:
[ApiVersion(“1.0”)]
[Route(“api/v{version:apiVersion}/products”)]
public class ProductsV1Controller : ControllerBase { }
[ApiVersion(“2.0”)]
[Route(“api/v{version:apiVersion}/products”)]
public class ProductsV2Controller : ControllerBase { }
Caching یکی از مهمترین تکنیکها برای بالا بردن سرعت API است. به جای هر بار Query گرفتن از دیتابیس، نتیجه را کش میکنی:
یک توسعهدهنده حرفهای کد مینویسد، تست هم مینویسد! تستنویسی برای Web API دو سطح دارد:
// Integration Test نمونه public class ProductsControllerTests : IClassFixture> { private readonly HttpClient _client; public ProductsControllerTests(WebApplicationFactory factory) { _client = factory.CreateClient(); } [Fact] public async Task GetAllProducts_ReturnsOkResult() { var response = await _client.GetAsync(“/api/products”); response.EnsureSuccessStatusCode(); Assert.Equal(“application/json”, response.Content.Headers.ContentType?.MediaType); } }
بعد از توسعه، نوبت به استقرار (Deployment) میرسد. گزینههای محبوب در ایران:
📈 رقبای شما همین الان در گوگل پیدا میشوند — شما چطور؟
داشتن یک سایت بدون سئو مثل داشتن یک مغازه در کوچهای بنبست است. تیم متخصص ما با استراتژیهای اثباتشده، سایت شما را به صفحه اول گوگل میرساند و فروشتان را چند برابر میکند. همین حالا برای مشاوره رایگان تماس بگیرید:
📞 09190994063 | 09376846692
Web Service اصطلاح عمومیتری است که شامل SOAP و REST میشود. Web API معمولاً به سرویسهای مبتنی بر HTTP/REST اشاره دارد و سادهتر، سبکتر و محبوبتر است. در دنیای مدرن، اغلب Web API با JSON و REST استفاده میشود که نسبت به SOAP با XML بسیار کاربردیتر است.
قطعاً .NET Core (حالا .NET 6, 7, 8) را یاد بگیر. .NET Framework قدیمی است و فقط روی ویندوز اجرا میشود. نسخههای جدید .NET کراسپلتفرم، سریعتر و با پشتیبانی فعال هستند. اگر پروژه جدید شروع میکنی، حتماً از .NET 8 استفاده کن.
باید CORS (Cross-Origin Resource Sharing) را در API پیکربندی کنی تا درخواستهای فرانتاند قبول شوند. در Program.cs از builder.Services.AddCors() استفاده کن و دامنه فرانتاند را اضافه کن. سپس فرانتاند با fetch API یا Axios میتواند با API ارتباط برقرار کند.
Minimal API از .NET 6 معرفی شد و برای پروژههای کوچک و Microserviceهای ساده عالی است. کد کمتری مینویسی اما برای پروژههای بزرگ، Controller-based API همچنان ساختارمندتر و نگهداریپذیرتر است. انتخاب بین این دو به اندازه و پیچیدگی پروژه بستگی دارد.
امنیت Web API چند لایه دارد: اول احراز هویت با JWT، دوم اعتبارسنجی کامل ورودیها، سوم Rate Limiting برای جلوگیری از DDoS، چهارم HTTPS اجباری، پنجم پیشگیری از SQL Injection با EF Core، و ششم CORS صحیح. همچنین از ابزارهایی مثل OWASP ZAP برای تست امنیت استفاده کن.
بازار کار C# و ASP.NET Core در ایران بسیار قوی است. اغلب شرکتهای نرمافزاری بزرگ ایرانی از این تکنولوژی استفاده میکنند. حقوق یک توسعهدهنده متوسط C# در تهران چشمگیر است و توسعهدهندگان ارشد با تسلط بر Web API، Entity Framework و Docker در بازار کار بسیار مورد تقاضا هستند. همچنین امکان کار با شرکتهای خارجی بهصورت ریموت نیز وجود دارد.
📚 جمعبندی: یادگیری Web API با C# یک مهارت ارزشمند است که درهای زیادی را باز میکند. مسیر را با پروژههای کوچک شروع کن، مفاهیم را عمیق یاد بگیر و کد بزن. موفقیت در این مسیر به تمرین مداوم نیاز دارد.