بوابة API لخدمات Swift: بناء جسر بين الخدمات المصغرة
\n\nتخيل أن backend الخاص بك هو مركز تسوق ضخم. بداخله عشرات المتاجر (الخدمات المصغرة): المصادقة، كتالوج المنتجات، سلة التسوق، المدفوعات، الإشعارات. يحتاج العميل (تطبيق iOS) إلى الدخول إلى كل متجر على حدة - هذه فوضى، تستغرق وقتًا طويلاً وغير آمنة. بوابة API هي المدخل الرئيسي، والحارس، والملاح في جهاز واحد. تستقبل الطلبات، وتفحص التصاريح، وتوجه إلى القسم المناسب، وتعيد النتيجة.
\n\nفي عالم Swift، حيث يكتسب Vapor و Hummingbird زخمًا، إنشاء بوابة API خاصة بك ليس رفاهية، بل ضرورة للمشاريع القابلة للتوسع. اليوم سنشرح كيفية كتابة بوابة خفيفة الوزن بلغة Swift، والتي ستدمج خدماتك في نظام بيئي واحد.
\n\nلماذا نحتاج بوابة API في بنية Swift؟
\n\nعندما يكون لديك 2-3 خدمات مصغرة، يمكن للعميل التواصل مع كل منها مباشرة. ولكن عندما يكون لديك 10+ (سيناريو نموذجي للتكنولوجيا المالية، التجارة الإلكترونية أو SaaS)، تظهر مشاكل:
\n\n- \n
- كود عميل منتفخ - كل خدمة لها endpoint خاص بها، تنسيق أخطاء، بروتوكول مصادقة خاص \n
- ثغرات أمنية - كل خدمة مضطرة للتعامل مع CORS، تحديد المعدل، التحقق من JWT بنفسها \n
- صعوبة إعادة الهيكلة - أعدت تسمية خدمة؟ غير الكود على جميع العملاء \n
- حركة مرور زائدة - يقوم العميل بـ 5 طلبات بدلاً من طلب واحد لتجميع الصفحة \n
بوابة API تحل هذه المشاكل، لتصبح نقطة دخول واحدة. يمكنها تجميع البيانات من عدة خدمات مصغرة في رد واحد، وتطبيق سياسات الأمان، وتسجيل جميع الطلبات. لمطوري Swift، هذه أيضًا فرصة لاستخدام الكتابة الصارمة للغة على مستوى البوابة.
\n\nاختيار الأداة: Vapor + Hummingbird
\n\nلإنشاء بوابة API بلغة Swift، Vapor هو الأنسب - أكثر إطار عمل ناضج في النظام البيئي. يوفر middleware، توجيه، طلبات عميل (عبر Client) ودعم async/await. البديل هو Hummingbird (خفيف، سريع، من Apple)، لكن للمثال سنستخدم Vapor كونه أكثر توثيقًا.
بوابتنا ستؤدي ثلاث وظائف:
\n- \n
- توجيه الطلبات إلى الخدمة المصغرة المناسبة \n
- المصادقة عبر JWT \n
- تجميع البيانات من خدمتين في رد واحد \n
الخطوة 1. هيكل المشروع الأساسي
\n\nننشئ مشروع Vapor جديد:
\nvapor new APIGateway --template=api\ncd APIGateway\n\nنضيف في Package.swift تبعية لـ JWT:
.package(url: "https://github.com/vapor/jwt.git", from: "4.0.0")\n\nونربطها في target:
\n.target(name: "App", dependencies: [\n .product(name: "Vapor", package: "vapor"),\n .product(name: "JWT", package: "jwt")\n])\n\nالخطوة 2. Middleware للمصادقة
\n\nننشئ middleware يتحقق من رمز JWT ويمرر معلومات المستخدم إلى الأمام. هذا نمط كلاسيكي لبوابة API بلغة Swift:
\n\nimport Vapor\nimport JWT\n\nstruct JWTAuthenticator: AsyncMiddleware {\n func respond(to request: Request, chainingTo next: AsyncResponder) async throws -> Response {\n guard let token = request.headers.bearerAuthorization?.token else {\n throw Abort(.unauthorized, reason: "Missing Bearer token")\n }\n \n // نتحقق من التوقيع ومدة الصلاحية\n let payload = try await request.jwt.verify(token, as: UserPayload.self)\n \n // نحفظ المستخدم في تخزين الطلب\n request.storage.set(UserPayloadKey.self, to: payload)\n \n return try await next.respond(to: request)\n }\n}\n\nstruct UserPayload: JWTPayload {\n var userID: UUID\n var role: String\n var exp: ExpirationClaim\n \n func verify(using signer: JWTSigner) throws {\n