مقدمة: لماذا REST API على Swift سريعة وحديثة
تطوير تطبيقات الهاتف المحمول لنظامي iOS وmacOS لا يتطلب واجهة جميلة فحسب، بل يتطلب أيضًا خادمًا خلفيًا موثوقًا. تظل REST API (نقل الحالة التمثيلية) المعيار الفعلي لتبادل البيانات بين العميل والخادم. إذا كنت تكتب بالفعل بلغة Swift لنظام Apple البيئي، فإن إنشاء API بنفس اللغة هو خطوة منطقية. يتيح لك ذلك إعادة استخدام نماذج البيانات، وتجنب تكرار الكود، وتنفيذ التغييرات بشكل أسرع.
في هذه المقالة، سنوضح لك كيفية كتابة REST API كاملة في Swift باستخدام إطار عمل Vapor — إطار الويب الأكثر شيوعًا لـ Swift. ستتعلم كيفية إعداد مشروع، وإنشاء مسارات، والتعامل مع JSON، وتشغيل الخادم. العملية بأكملها لن تستغرق أكثر من 30 دقيقة. مستعد؟ هيا بنا!
1. إعداد البيئة وتثبيت Vapor
قبل كتابة الكود، تأكد من تثبيت الأدوات اللازمة. يتطلب العمل مع Vapor إصدار Swift 5.9 أو أحدث (يُوصى باستخدام Swift 6). ستحتاج أيضًا إلى طرفية ومحرر كود (Xcode أو VS Code).
تثبيت Vapor Toolbox
Vapor Toolbox هي أداة مساعدة لسطر الأوامر تبسط إنشاء وإدارة المشاريع. قم بتثبيتها عبر Homebrew:
brew install vaporإذا لم يكن Homebrew مثبتًا، قم بتنزيله من brew.sh. بعد التثبيت، تحقق من الإصدار:
vapor --versionإنشاء مشروع جديد
افتح الطرفية وقم بتشغيل الأمر:
vapor new MyAPI --template=apiالعلامة --template=api تنشئ هيكلًا أساسيًا لـ REST API بدون ملفات غير ضرورية. انتقل إلى مجلد المشروع:
cd MyAPIالآن افتح المشروع في Xcode:
open Package.swiftأو استخدم أي محرر آخر. تم! لديك قالب Vapor نظيف.
2. الهيكل الأساسي: النماذج، المتحكمات، والمسارات
يستخدم Vapor بنية MVC (Model-View-Controller) المُكيَّفة للتطوير من جانب الخادم. سنقوم بإنشاء API بسيط لإدارة قائمة المهام.
إنشاء النموذج
النموذج هو هيكل يصف البيانات. في مجلد Sources/App/Models/، أنشئ ملفًا Todo.swift:
import Fluentimport Vapor
final class Todo: Model, Content { static let schema = "todos" @ID(key: .id) var id: UUID? @Field(key: "title") var title: String @Field(key: "is_completed") var isCompleted: Bool init() { } init(id: UUID? = nil, title: String, isCompleted: Bool = false) { self.id = id self.title = title self.isCompleted = isCompleted }}نستخدم Fluent — ORM الخاص بـ Vapor للعمل مع قواعد البيانات. يتم تسلسل النموذج تلقائيًا إلى JSON بفضل بروتوكول Content.
إنشاء المتحكم
يحتوي المتحكم على منطق معالجة الطلب. أنشئ ملفًا Sources/App/Controllers/TodoController.swift:
import Vaporimport Fluent
struct TodoController: RouteCollection { func boot(routes: RoutesBuilder) throws { let todos = routes.grouped("todos") todos.get(use: index) todos.post(use: create) todos.group(":todoID") { todo in todo.delete(use: delete) } } // GET /todos — الحصول على جميع المهام func index(req: Request) async throws -> [Todo] { try await Todo.query(on: req.db).all() } // POST /todos — إنشاء مهمة func create(req: Request) async throws -> Todo { let todo = try req.content.decode(Todo.self) try await todo.save(on: req.db) return todo } // DELETE /todos/:id — حذف مهمة func delete(req: R