مقدمة: Swift — ليس فقط لتطبيقات الهواتف المحمولة
لطالما اعتاد العديد من المطورين على ربط Swift حصريًا بنظامي iOS و macOS. ومع ذلك، فقد تجاوزت هذه اللغة حدود نظام Apple البيئي منذ زمن طويل. مع ظهور أطر العمل من جانب الخادم مثل Vapor و Kitura، أصبحت Swift أداة متكاملة لتطوير الواجهات الخلفية. في هذه المقالة، سنكتب REST API كاملة باستخدام Swift وإطار العمل Vapor في 30 دقيقة. ستتعلم كيفية إعداد مشروع، وإنشاء نقاط النهاية، وربط قاعدة بيانات، ومعالجة الأخطاء. مستعد؟ هيا بنا!
الخطوة 1: تثبيت المشروع وإعداده
أولاً، تأكد من تثبيت Swift 5.5 أو إصدار أحدث. يمكنك التحقق من الإصدار باستخدام الأمر:
swift --version
بعد ذلك، قم بتثبيت Vapor Toolbox — وهي أداة مساعدة لإدارة المشاريع:
brew install vapor
الآن لنقم بإنشاء مشروع جديد:
vapor new MyAPI --template=api
سينشئ هذا الأمر هيكل مجلدات مع قالب API جاهز. انتقل إلى مجلد المشروع وقم بتشغيل أمر البناء:
cd MyAPI
vapor build
إذا نجحت عملية البناء، قم بتشغيل الخادم:
vapor run
افتراضيًا، سيكون الخادم متاحًا على http://127.0.0.1:8080. افتح متصفحك وانتقل إلى هذا العنوان — يجب أن ترى رسالة ترحيب.
هيكل مشروع Vapor
- Sources/App — الدليل الرئيسي لكود التطبيق
- Sources/App/Controllers — المتحكمات (Controllers) لمعالجة الطلبات
- Sources/App/Models — نماذج البيانات
- Sources/App/routes.swift — ملف تسجيل المسارات (Routes)
- configure.swift — إعدادات التطبيق وقاعدة البيانات
الخطوة 2: إنشاء نموذج البيانات وقاعدة البيانات
في هذا المثال، سنقوم بإنشاء API بسيط لإدارة قائمة المهام (To-Do List). لنبدأ بنموذج البيانات. قم بإنشاء ملف Todo.swift في مجلد Sources/App/Models:
import Fluent
import 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
}
}
الآن لنقم بإنشاء ترحيل (Migration) للجدول. في الملف Sources/App/Migrations/CreateTodo.swift:
import Fluent
struct CreateTodo: Migration {
func prepare(on database: Database) -> EventLoopFuture<Void> {
database.schema("todos")
.id()
.field("title", .string, .required)
.field("is_completed", .bool, .required)
.create()
}
func revert(on database: Database) -> EventLoopFuture<Void> {
database.schema("todos").delete()
}
}
لا تنس تسجيل الترحيل في ملف configure.swift:
app.migrations.add(CreateTodo())
للبساطة، سنستخدم SQLite (قاعدة بيانات مدمجة). أضف هذا السطر إلى configure.swift:
app.databases.use(.sqlite(.file("db.sqlite")), as: .sqlite)
الخطوة 3: إنشاء نقاط نهاية REST API
الآن الجزء الأكثر إثارة — تنفيذ عمليات CRUD. قم بإنشاء متحكم TodoController.swift في مجلد Sources/App/Controllers:
import Vapor
struct TodoController: RouteCollection {
func boot(routes: RoutesBuilder) throws {
let todos = routes.grouped("api", "todos")
todos.get(use: index)
todos.post(use: create)
todos.group(":todoID") { todo in
todo.get(use: show)