مقدمة: REST API بلغة C# — أسهل مما يبدو
تطوير تطبيقات الويب والخدمات المصغرة لا يمكن تصوره بدون REST API. إذا كنت قد بدأت للتو رحلتك في البرمجة، فقد يبدو إنشاء API خاص بك مهمة صعبة. ومع ذلك، باستخدام إطار العمل ASP.NET Core بلغة C#، يمكنك كتابة خدمة RESTful عاملة حرفيًا في 30 دقيقة.
في هذا الدليل، سنقوم خطوة بخطوة بإنشاء API بسيط لإدارة قائمة المهام (Todo List). ستتعلم كيفية إعداد المشروع، وإنشاء نموذج البيانات، والمتحكم (Controller)، واختبار نقاط النهاية (Endpoints). لا سحر — فقط كود نظيف وشروحات واضحة.
في نهاية المقال، سيكون لديك API يعمل بكامل وظائفه ويدعم جميع عمليات CRUD الأساسية (إنشاء، قراءة، تحديث، حذف).
الخطوة 1: إعداد البيئة وإنشاء المشروع
قبل كتابة الكود، تأكد من تثبيت الأدوات اللازمة:
- .NET SDK (الإصدار 8.0 أو أحدث) — قم بالتنزيل من الموقع الرسمي لـ Microsoft
- Visual Studio (إصدار 2022 Community) أو Visual Studio Code مع إضافة C#
- Postman أو أي عميل REST آخر للاختبار
افتح الطرفية (Terminal) أو سطر الأوامر ونفذ الأمر التالي لإنشاء مشروع Web API جديد:
dotnet new webapi -n TodoApicd TodoApiبعد إنشاء المشروع، افتح المجلد TodoApi في بيئة التطوير المتكاملة (IDE) الخاصة بك. سيحتوي هيكل المشروع على عدة مجلدات وملفات، لكننا الآن مهتمون بثلاثة ملفات رئيسية: Program.cs و Controllers و Models.
الخطوة 2: إنشاء نموذج البيانات
النموذج (Model) هو فئة تصف بنية البيانات الخاصة بـ API الخاص بنا. لقائمة المهام، سنحتاج إلى ثلاثة حقول: معرف فريد، اسم، وحالة الإنجاز.
أنشئ مجلدًا جديدًا باسم Models في جذر المشروع، وداخله ملفًا باسم TodoItem.cs:
namespace TodoApi.Models;
public class TodoItem{ public int Id { get; set; } public string? Name { get; set; } public bool IsComplete { get; set; }}لاحظ علامة الاستفهام بعد string. تشير إلى أن الخاصية Name يمكن أن تكون null. هذه ممارسة جيدة لتجنب تحذيرات المترجم (Compiler).
الخطوة 3: إنشاء المتحكم (Controller) وتنفيذ CRUD
المتحكم (Controller) هو فئة تعالج طلبات HTTP. في ASP.NET Core، ترث المتحكمات من ControllerBase وتستخدم السمات (Attributes) للتوجيه (Routing).
أنشئ ملفًا باسم TodoItemsController.cs في مجلد Controllers:
using Microsoft.AspNetCore.Mvc;using TodoApi.Models;
namespace TodoApi.Controllers;
[ApiController][Route("api/[controller]")]public class TodoItemsController : ControllerBase{ private static List<TodoItem> _todoItems = new();
// GET: api/TodoItems [HttpGet] public ActionResult<IEnumerable<TodoItem>> GetTodoItems() { return _todoItems; }
// GET: api/TodoItems/1 [HttpGet("{id}")] public ActionResult<TodoItem> GetTodoItem(int id) { var item = _todoItems.FirstOrDefault(t => t.Id == id); if (item == null) return NotFound(); return item; }
// POST: api/TodoItems [HttpPost] public ActionResult<TodoItem> PostTodoItem(TodoItem item) { item.Id = _todoItems.Count + 1; _todoItems.Add(item); return CreatedAtAction(nameof(GetTodoItem), new { id = item.Id }, item); }
// PUT: api/TodoItems/1 [HttpPut("{id}")] public IActionResult PutTodoItem(int id, TodoItem updatedItem) { var existingItem = _todoItems.First