بوابة API لخدمات Swift: كيفية دمج الخدمات المصغرة في نظام واحد

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

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

ابدأ الدورة

بوابة 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
\n\n

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

\n\n

اختيار الأداة: Vapor + Hummingbird

\n\n

لإنشاء بوابة API بلغة Swift، Vapor هو الأنسب - أكثر إطار عمل ناضج في النظام البيئي. يوفر middleware، توجيه، طلبات عميل (عبر Client) ودعم async/await. البديل هو Hummingbird (خفيف، سريع، من Apple)، لكن للمثال سنستخدم Vapor كونه أكثر توثيقًا.

\n\n

بوابتنا ستؤدي ثلاث وظائف:

\n
    \n
  • توجيه الطلبات إلى الخدمة المصغرة المناسبة
  • \n
  • المصادقة عبر JWT
  • \n
  • تجميع البيانات من خدمتين في رد واحد
  • \n
\n\n

الخطوة 1. هيكل المشروع الأساسي

\n\n

ننشئ مشروع Vapor جديد:

\n
vapor new APIGateway --template=api\ncd APIGateway
\n\n

نضيف في Package.swift تبعية لـ JWT:

\n
.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\n
import 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                

المدونات

توصيات الكتب