تصميم واجهات برمجة التطبيقات API: مبادئ الوضوح والثبات والأمان للمطورين
- نُشر في:
- مدة القراءة: 5 دقائق
- الكاتب: فريق كُميت
تعتمد التطبيقات الحديثة على واجهات برمجة التطبيقات API في كل شيء تقريبًا: تطبيق الجوال يجلب بياناته منها، والموقع يرسل الطلبات عبرها، والشركاء يتكاملون مع نظامك من خلالها. وحين تُصمم الواجهة على عجل، تتحول إلى مصدر دائم للأخطاء وأسئلة الدعم والتعديلات المتعارضة. يعرض هذا المقال مبادئ عملية لتصميم واجهة برمجية يسهل استخدامها وتطويرها دون أن تكسر ما بُني عليها.
1. الواجهة البرمجية عقد قبل أن تكون شيفرة
أهم تحول في التفكير أن تُعامل الواجهة البرمجية كعقد بين طرفين: من يقدم الخدمة ومن يستهلكها. وبمجرد أن يبني تطبيق جوال أو نظام شريك على هذا العقد، يصبح تغييره مكلفًا، لأن التطبيقات المثبتة على أجهزة المستخدمين لا تتحدث كلها في اللحظة نفسها.
لذلك يتبنى كثير من الفرق نهج «التصميم أولًا»، حيث تُكتب مواصفة الواجهة وتُراجع مع فرق الواجهة الأمامية والجوال قبل كتابة أي شيفرة خلفية. وتكشف هذه المراجعة مبكرًا ما ينقص الشاشات من بيانات، وما يُطلب بأكثر من استدعاء دون داع، وما يحمل أسماء غامضة. ويستطيع كل فريق بعدها أن يعمل بالتوازي، اعتمادًا على مواصفة متفق عليها بدل انتظار اكتمال الواجهة الخلفية.
2. تسمية الموارد وبنية المسارات
في أسلوب REST الشائع تُنظم الواجهة حول «موارد» هي الكيانات التي يتعامل معها النظام، وتُعبّر عنها مسارات واضحة، بينما تُعبّر طرق HTTP عن نوع العملية. ومن القواعد التي تجعل الواجهة مقروءة ومتوقعة:
- أسماء لا أفعال: يُكتب المسار
/ordersلا/getOrders، لأن الطريقة GET تعبّر عن الفعل. - صيغة الجمع للمجموعات:
/customersللقائمة و/customers/42لعميل محدد. - علاقات منطقية:
/customers/42/ordersلطلبات عميل بعينه، دون تعمق مفرط في المستويات. - اتساق التسمية: اعتماد أسلوب واحد لأسماء الحقول في الواجهة كلها، وعدم الخلط بين أنماط مختلفة.
- طرق HTTP في مواضعها: GET للقراءة، وPOST للإنشاء، وPUT أو PATCH للتعديل، وDELETE للحذف.
3. رموز الاستجابة ورسائل الخطأ
رمز الاستجابة هو أول ما يقرؤه المطور المستهلك ليعرف ما حدث، واستخدامه بدقة يوفر عليه ساعات من التخمين. فالرمز 200 يعني النجاح، و201 يعني إنشاء مورد جديد، و400 يعني خطأ في الطلب، و401 يعني أن المستخدم غير مُصادَق عليه، و403 أنه لا يملك الصلاحية، و404 أن المورد غير موجود، و409 أن الطلب يتعارض مع حالة قائمة، و500 أن الخطأ من جهة الخادم.
مثال توضيحي: لنفترض أن تطبيق حجوزات أرسل طلبًا لحجز موعد محجوز مسبقًا، فأعاد الخادم الرمز 200 مع رسالة نصية تقول «فشل الحجز». سيعامل التطبيق الاستجابة كنجاح ما لم يقرأ النص ويحلله. أما الاستجابة الأوضح فتعيد الرمز 409 مع جسم موحد يتضمن رمز خطأ ثابتًا يمكن للبرنامج فهمه، ورسالة مفهومة، وتحديدًا للحقل المسبب، فيعرض التطبيق للمستخدم سببًا واضحًا ويقترح موعدًا آخر.
4. الترقيم والتصفية والفرز
لا ينبغي أن تُعيد واجهة القوائم كل السجلات دفعة واحدة، فما يعمل مع مئة سجل في بيئة الاختبار قد يُسقط النظام مع مئات الآلاف في الإنتاج. لذلك تُصمم القوائم من البداية بالترقيم Pagination، بحيث يطلب المستهلك صفحة محددة بحجم محدود، مع حد أقصى يفرضه الخادم مهما طُلب.
وللترقيم أسلوبان شائعان: الترقيم بالإزاحة الذي يطلب الصفحة الثالثة مثلًا، وهو بسيط ومألوف، والترقيم بالمؤشر الذي يطلب السجلات التالية لآخر سجل وصل إليه المستهلك، وهو أنسب للبيانات الكبيرة سريعة التغير لأنه لا يكرر السجلات ولا يتخطاها حين تُضاف بيانات جديدة. ويُستحسن أن تتبع معاملات التصفية والفرز نمطًا موحدًا في كل الواجهات، كتصفية الطلبات حسب الحالة والتاريخ وفرزها حسب الأحدث، حتى لا يحتاج المطور إلى تعلم أسلوب جديد مع كل مسار.
5. الإصدارات والتغييرات الكاسرة
التغيير الكاسر هو كل تعديل يجعل الاستدعاءات القائمة تفشل أو تتصرف بشكل مختلف، كحذف حقل أو تغيير اسمه أو نوعه، أو جعل حقل اختياري إلزاميًا. أما إضافة حقل جديد اختياري أو مسار جديد فلا تكسر شيئًا عادة. ولإدارة التغييرات الكاسرة تُعتمد سياسة إصدارات واضحة:
- رقم الإصدار في المسار أو الترويسة: مثل
/v1/orders، بحيث يبقى الإصدار القديم يعمل حين يُطلق الجديد. - فترة انتقال معلنة: يُبلَّغ المستهلكون بموعد إيقاف الإصدار القديم قبل وقت كافٍ.
- إشعار الإهمال: تُعلَّم الحقول والمسارات المهملة في التوثيق والاستجابات قبل حذفها.
- سجل التغييرات: توثيق مختصر لكل ما أُضيف أو عُدّل أو أُهمل في كل إصدار.
6. المصادقة والصلاحيات وحماية الواجهة
الواجهة البرمجية باب مفتوح على بيانات النظام، وأي خلل فيها يُستغل مباشرة دون المرور بالشاشات وقيودها. لذلك لا يكفي إخفاء زر في الواجهة الأمامية، بل يجب أن يتحقق الخادم في كل طلب من هوية المستخدم ومن حقه في الوصول إلى المورد المطلوب تحديدًا، لا إلى نوع الموارد عمومًا.
ومن الثغرات الشائعة أن يغيّر المستخدم رقم الطلب في المسار فيرى طلب عميل آخر، لأن الخادم تحقق من تسجيل الدخول ولم يتحقق من ملكية الطلب. وتشمل الحماية أيضًا استخدام HTTPS في كل الاتصالات، والاعتماد على معايير مجربة مثل OAuth 2.0 للمصادقة بدل ابتكار أنظمة خاصة، وتحديد معدل الطلبات لكل مستخدم لمنع الإساءة مع إعادة الرمز 429 عند تجاوزه، وعدم إعادة حقول حساسة لا يحتاجها المستهلك، والتحقق من كل مدخل قبل معالجته.
7. التوثيق وتجربة المطور
الواجهة التي لا يفهمها المطورون لن تُستخدم بشكل صحيح مهما كان تصميمها متقنًا. والتوثيق الجيد ليس قائمة بالمسارات فقط، بل دليل يمكّن مطورًا جديدًا من إجراء أول استدعاء ناجح بسرعة. ومن عناصره:
- مواصفة قابلة للقراءة الآلية: مثل OpenAPI، تُولَّد منها صفحات توثيق تفاعلية وأحيانًا مكتبات استدعاء جاهزة.
- أمثلة واقعية: طلب واستجابة كاملان لكل مسار، بما في ذلك حالات الخطأ.
- دليل البدء: خطوات الحصول على مفاتيح الوصول وإجراء أول طلب.
- بيئة تجريبية: نسخة معزولة يختبر فيها الشركاء تكاملهم دون المساس بالبيانات الحقيقية.
- توثيق متزامن مع الشيفرة: يُحدَّث مع كل تغيير، ويُفضل توليده من المواصفة نفسها.
8. عمليات آمنة التكرار والعمليات الطويلة
الشبكات غير موثوقة، وقد يرسل التطبيق طلبًا فلا تصله الاستجابة، فيعيد المحاولة. فإذا كانت العملية إنشاء طلب شراء أو تنفيذ دفع، فإن إعادة الطلب قد تنشئ طلبين أو تخصم المبلغ مرتين. ولهذا تُصمم العمليات الحساسة لتكون آمنة التكرار Idempotent، بأن يرسل المستهلك مفتاحًا فريدًا مع الطلب، فيتعرف الخادم على المحاولة المكررة ويعيد نتيجة المحاولة الأولى بدل تنفيذها من جديد.
مثال توضيحي: لنفترض أن نظامًا يولّد تقريرًا سنويًا يستغرق دقائق. إبقاء الاتصال مفتوحًا طوال هذه المدة يعرّضه للانقطاع. والتصميم الأنسب أن يستقبل الخادم الطلب ويعيد فورًا الرمز 202 مع معرّف للمهمة، ثم يستعلم المستهلك عن حالتها لاحقًا، أو يتلقى إشعارًا عبر Webhook عند اكتمالها.
الخلاصة
تصميم الواجهة البرمجية قرار طويل الأمد، لأنها عقد يعتمد عليه آخرون. صمم الواجهة وراجعها قبل كتابة الشيفرة، واستخدم أسماء موارد متسقة وطرق HTTP في مواضعها، وأعد رموز استجابة دقيقة ورسائل خطأ موحدة. ابنِ الترقيم من البداية، وأدر التغييرات الكاسرة بسياسة إصدارات معلنة، وتحقق من الصلاحية على مستوى كل مورد. ووثّق الواجهة بمواصفة قابلة للقراءة الآلية وأمثلة واقعية، واجعل العمليات الحساسة آمنة التكرار، فتحصل على واجهة يثق بها من يبني عليها. ومن المفيد أن يُعيَّن مسؤول عن اتساق الواجهات في النظام كله، يراجع كل مسار جديد قبل اعتماده وفق دليل تصميم مكتوب.
الأسئلة الشائعة
ما هي واجهة برمجة التطبيقات API؟
هي مجموعة قواعد ومسارات محددة تتيح لبرنامج أن يطلب بيانات أو خدمات من برنامج آخر، كأن يجلب تطبيق الجوال قائمة الطلبات من خادم النظام.
ما المقصود بواجهة REST؟
هي أسلوب شائع في تصميم الواجهات البرمجية ينظمها حول موارد ذات مسارات واضحة، ويستخدم طرق HTTP مثل GET وPOST للتعبير عن نوع العملية.
كيف أغيّر واجهة برمجية دون أن تتعطل التطبيقات التي تستخدمها؟
تُضاف التغييرات غير الكاسرة كالحقول الاختيارية مباشرة، أما التغييرات الكاسرة فتُطلق في إصدار جديد مع إبقاء الإصدار القديم فترة انتقال معلنة.
ما هي مواصفة OpenAPI؟
هي صيغة معيارية لوصف الواجهات البرمجية بشكل يقرؤه الإنسان والآلة معًا، وتُستخدم لتوليد توثيق تفاعلي واختبار الواجهة وتوليد مكتبات الاستدعاء.
كتب بواسطة
فريق كُميت
فريق كُميت للإنتاج الإبداعي والتسويق في الرياض، يكتب هنا عن التقنية والتحول الرقمي من واقع المشاريع التي يعمل عليها.