كيفية كتابة REST API بلغة Swift في 30 دقيقة: للمبتدئين
Swift ليست مجرد لغة لإنشاء تطبيقات الهاتف المحمول لأنظمة iOS وmacOS. مع ظهور إطار العمل Vapor، أصبح تطوير تطبيقات الخادم بلغة Swift متاحًا وسهلًا. في هذه المقالة، سنوضح كيفية كتابة REST API بسيط بلغة Swift في 30 دقيقة حرفيًا. ستتعلم المبادئ الأساسية للعمل مع Vapor، وكيفية إنشاء المسارات، ومعالجة الطلبات، وإرجاع استجابات JSON.
هذا الدليل مثالي للمبتدئين الذين هم على دراية بأساسيات Swift، لكنهم لم يكتبوا أبدًا كود خادم. سنشرح العملية خطوة بخطوة، مع أمثلة الكود والشروحات.
ما هو REST API ولماذا هو مطلوب؟
REST (Representational State Transfer) هو نمط معماري لتفاعل مكونات التطبيق الموزع عبر الشبكة. يسمح REST API للتطبيقات العميلة (مثل تطبيق iOS) بإرسال واستقبال البيانات من الخادم عبر طلبات HTTP.
طرق HTTP الرئيسية المستخدمة في REST:
- GET — الحصول على البيانات
- POST — إنشاء مورد جديد
- PUT — تحديث مورد موجود
- DELETE — حذف مورد
لمثالنا، سننشئ API بسيطًا لإدارة قائمة المهام (Todo List). سيدعم جميع العمليات الأساسية الأربع CRUD (إنشاء، قراءة، تحديث، حذف).
تثبيت Vapor وإنشاء المشروع
Vapor هو إطار العمل الأكثر شيوعًا لتطوير الويب بلغة Swift. للبدء، قم بتثبيت Vapor Toolbox عبر Homebrew:
brew install vaporبعد التثبيت، قم بإنشاء مشروع جديد:
vapor new TodoAPIcd TodoAPIسينشئ هذا الأمر هيكل المشروع مع خادم مُعد مسبقًا. افتح المشروع في Xcode:
open Package.swiftفي Xcode، سترى الهيكل القياسي لمشروع Vapor. الكود الرئيسي موجود في مجلد Sources/App.
إنشاء نموذج البيانات
للعمل مع المهام، نحتاج إلى نموذج. لننشئ ملف Todo.swift في مجلد Sources/App/Models:
import Vaporimport Fluent
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 للغة Swift، والذي يعمل مع قواعد البيانات. في مثالنا، سنستخدم SQLite للبساطة. لاحظ البروتوكول Content — فهو يسمح بترميز/فك ترميز النموذج تلقائيًا إلى JSON.
إعداد الترحيل وقاعدة البيانات
الآن، لننشئ ترحيلًا لنموذجنا. أضف ملف CreateTodo.swift إلى مجلد Sources/App/Migrations:
import Fluent
struct CreateTodo: Migration { func prepare(on database: Database) -> EventLoopFuture<Void> { return database.schema("todos") .id() .field("title", .string, .required) .field("is_completed", .bool, .required) .create() } func revert(on database: Database) -> EventLoopFuture<Void> { return database.schema("todos").delete() }}في ملف configure.swift، أضف تسجيل قاعدة البيانات والترحيل:
import Fluentimport FluentSQLiteDriver
public func configure(_ app: Application) throws { app.databases.use(.sqlite(.file("db.sqlite")), as: .sqlite) app.migrations.add(CreateTodo())