العمل مع API في Swift: REST، GraphQL، gRPC – أيهما تختار في 2025؟

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

API في Swift: من النظرية إلى الطلبات الحقيقية

\n\n

كل مطور iOS يواجه عاجلاً أم آجلاً الحاجة إلى تواصل التطبيق مع الخادم. سواء كان تحميل خلاصة الأخبار، إرسال بيانات النموذج، أو البث المباشر في الوقت الفعلي — لا يمكن الاستغناء عن API (واجهة برمجة التطبيقات). ولكن أي بروتوكول تختار؟ REST الكلاسيكي، GraphQL المرن، أم gRPC فائق السرعة؟

\n\n

في هذه المقالة، لن نقوم فقط بسرد الإيجابيات والسلبيات. سنقوم بتحليل العمل مع API في Swift من خلال أمثلة حقيقية، وسنعرض الكود ونقدم نصائح عملية. ستتعلم كيفية هيكلة طبقة الشبكة بشكل صحيح، وأي المكتبات يجب استخدامها، ومتى يصبح كل نهج هو الخيار الأفضل.

\n\n

إذا كنت تكتب بلغة Swift وتريد أن يتواصل تطبيقك مع الخادم بسرعة وموثوقية وأناقة — فهذه المقالة لك. هيا بنا!

\n\n

REST API في Swift: الكلاسيكية التي لا تشيخ

\n\n

REST (نقل الحالة التمثيلية) هو أسلوب معماري يستخدم طرق HTTP (GET، POST، PUT، DELETE) للعمل مع الموارد. معظم واجهات API العامة (GitHub، Twitter، Stripe) مبنية على REST. بالنسبة لمطور Swift، هذا يعني أنك ستعمل مع JSON وURLSession أو Alamofire.

\n\n

طلب GET أساسي باستخدام URLSession

\n\n

لنبدأ بأبسط شيء — الحصول على البيانات. لنفترض أننا بحاجة لتحميل قائمة المستخدمين من JSONPlaceholder:

\n\n
import Foundation\n\nstruct User: Codable {\n    let id: Int\n    let name: String\n    let email: String\n}\n\nfunc fetchUsers() async throws -> [User] {\n    let url = URL(string: "https://jsonplaceholder.typicode.com/users")!\n    let (data, response) = try await URLSession.shared.data(from: url)\n    \n    guard let httpResponse = response as? HTTPURLResponse,\n          (200...299).contains(httpResponse.statusCode) else {\n        throw URLError(.badServerResponse)\n    }\n    \n    return try JSONDecoder().decode([User].self, from: data)\n}\n\nTask {\n    do {\n        let users = try await fetchUsers()\n        print("تم تحميل \\(users.count) مستخدم")\n    } catch {\n        print("خطأ: \\(error.localizedDescription)")\n    }\n}
\n\n

لاحظ استخدام async/await — هذه هي الطريقة الحديثة للعمل مع الكود غير المتزامن في Swift. أصبح الكود مقروءاً وقصيراً، بدون إغلاقات (closures) أو دوال استدعاء (callbacks).

\n\n

طلب POST باستخدام Alamofire

\n\n

Alamofire هي المكتبة الأكثر شيوعاً لـ العمل مع الشبكة في Swift. إنها تبسط معالجة الأخطاء، وترميز المعاملات، وتحميل الملفات. إليك مثال لإرسال البيانات:

\n\n
import Alamofire\n\nstruct NewUser: Encodable {\n    let name: String\n    let email: String\n}\n\nAF.request("https://jsonplaceholder.typicode.com/users",\n           method: .post,\n           parameters: NewUser(name: "إيفان", email: "ivan@example.com"),\n           encoder: JSONParameterEncoder.default)\n    .validate()\n    .responseDecodable(of: User.self) { response in\n        switch response.result {\n        case .success(let user):\n            print("تم إنشاء مستخدم بالمعرف: \\(user.id)")\n        case .failure(let error):\n            print("خطأ: \\(error.localizedDescription)")\n        }\n    }
\n\n

نصيحة: استخدم .validate() — سيقوم هذا تلقائياً بالتحقق من رمز الحالة وتحويل أخطاء HTTP إلى أخطاء Alamofire. سيكون كودك أنظف، وسيكون التصحيح أسهل.

\n\n

متى يكون REST هو الخيار الأفضل؟

\n
    \n
  • لديك تطبيق CRUD بسيط (ملاحظات، قائمة مهام).
  • \n
  • توفر API نقاط نهاية ثابتة.
  • \n
  • لا تحتاج إلى تداخل معقد للبيانات.
  • \n
\n\n

GraphQL في Swift: مرونة الاستعلامات

\n\n

GraphQL هي لغة استعلام تتيح للعميل طلب البيانات التي يحتاجها بالضبط. لا over-fetching (حقول زائدة) ولا under-fetching (الحاجة لعدة طلبات). بالنسبة لـ Swift، هناك مكتبة ممتازة Apollo iOS

المدونات

توصيات الكتب