مقدمة: لماذا تعتبر طلبات HTTP الصحيحة أساس أي تطبيق
في تطوير تطبيقات Swift الحديثة للهواتف المحمولة وأجهزة سطح المكتب، نادرًا ما تجد تطبيقًا يعمل بشكل مستقل تمامًا. تقريبًا أي تطبيق iOS أو macOS يتفاعل مع خوادم بعيدة: تحميل البيانات، إرسال النماذج، مزامنة المحتوى. عميل HTTP هو مكون رئيسي تعتمد عليه ليس فقط سرعة العمل، ولكن أيضًا أمان واستقرار التطبيق بأكمله.
في هذه المقالة، سنشرح كيفية إنشاء عميل HTTP موثوق به باستخدام إطار العمل المدمج Foundation. ستتعلم كيفية تكوين URLSession بشكل صحيح، معالجة الأخطاء، العمل مع JSON، واستخدام الأساليب الحديثة مثل async/await. ستكون المادة مفيدة لكل من المبتدئين الذين يتعلمون Swift للتو، والمطورين ذوي الخبرة الذين يرغبون في تنظيم معرفتهم.
1. أساسيات URLSession: أساس التفاعل الشبكي
في Swift، الأداة الرئيسية للعمل مع HTTP هي الفئة URLSession. وهي جزء من إطار العمل Foundation وتوفر واجهة برمجة تطبيقات مرنة لإرسال الطلبات واستلام الردود. تدعم URLSession عدة تكوينات، مما يسمح بتكييف السلوك وفقًا للمهام المحددة.
إنشاء وتكوين الجلسة
الخطوة الأولى هي إنشاء مثيل لـ URLSession بتكوين معين. هناك ثلاثة أنواع من التكوينات:
.default— التكوين القياسي مع التخزين المؤقت وحفظ الكوكيز؛.ephemeral— بدون حفظ البيانات على القرص (يتم تخزين الكوكيز والذاكرة المؤقتة في الذاكرة فقط)؛.background— للمهام الخلفية التي يمكن تنفيذها حتى بعد إغلاق التطبيق.
مثال على إنشاء جلسة بتكوين مخصص:
let configuration = URLSessionConfiguration.defaultconfiguration.timeoutIntervalForRequest = 30configuration.waitsForConnectivity = true
let session = URLSession(configuration: configuration)لاحظ المعامل waitsForConnectivity: إذا تم تعيينه على true، فلن يفشل الطلب بخطأ عند عدم وجود شبكة، بل سينتظر استعادة الاتصال. هذا مهم بشكل خاص لتطبيقات الهواتف المحمولة.
طلب GET أساسي
أبسط طريقة لتنفيذ طلب هي استخدام الدالة dataTask(with:). إليك مثال بسيط:
guard let url = URL(string: "https://api.example.com/users") else { return }
let task = session.dataTask(with: url) { data, response, error in if let error = error { print("خطأ في الطلب: \\(error.localizedDescription)") return } guard let httpResponse = response as? HTTPURLResponse, (200...299).contains(httpResponse.statusCode) else { print("استجابة خادم غير صحيحة") return } guard let data = data else { print("لا توجد بيانات في الرد") return } // معالجة البيانات print("تم استلام \\(data.count) بايت")}task.resume()نقطة مهمة: لا تنس استدعاء resume()، وإلا فلن يبدأ الطلب. هذا أحد الأخطاء الأكثر شيوعًا للمبتدئين.
2. العمل مع JSON: من البيانات إلى الكائنات
معظم واجهات برمجة التطبيقات الحديثة ترجع البيانات بتنسيق JSON. في Swift، للعمل مع JSON، يُستخدم البروتوكول Codable الذي يجمع بين Encodable و Decodable. هذا يسمح بتحويل البيانات بسهولة إلى نماذج والعكس.
إنشاء النموذج وفك الترميز
لنفترض أن الخادم يعيد قائمة من المستخدمين بهذا التنسيق:
[ { "id": 1, "name": "إيفان بيتروف", "email": "ivan@example.com" }]لننشئ الهيكل المناسب:
struct User: Coda