الغرض من هذه الواجهة
واجهة KayanOS البرمجية العامة هي واجهة خادم إلى خادم ذات إصدار محدد للسجلات التي أتاحتها المؤسسة عمداً. تصلح لتكامل مضبوط، مثل نظام تقارير لمركز خدمة يقرأ سجلات طلب خدمة مواطن المسموح بها أو يحدّث سجلاً معتمداً بحساب خدمة مُدار. ليست وسيلة لتجاوز الأدوار أو النطاقات أو رؤية الحقول أو قواعد الاعتماد أو البوابة العامة للنموذج. يعمل الرمز باسم العضو مالكه: لا يستطيع التكامل إلا تنفيذ أفعال الكيان ورؤية بيانات السجل/الحقل التي يملكها ذلك العضو. عامل كل رمز كبيان اعتماد عالي الحساسية.
قبل إرسال طلب
على مالك المؤسسة أو المسؤول الذي يملك صلاحية رموز الواجهة المناسبة إتمام القائمة التالية:- من إعداد الكيان، فعّل الكيان للواجهة العامة. يعيد الكيان غير المفعّل
ENTITY_NOT_FOUNDعبر هذه الواجهة حتى لو كان موجوداً داخلياً. - امنح مالك الرمز أقل الأفعال اللازمة للكيان:
listوcreateوupdateو/أوdelete. تظل النطاقات منطبقة على السجلات الفعلية. - راجع الحقول. يُحذف الحقل المحمي بفعل قراءة ما لم يملك مالك الرمز ذلك الفعل، كما لا يصلح للترشيح أو الفرز عبر v1.
- أنشئ رمزاً مسمىً له مالك وغرض وقرار انتهاء ومالك للتدوير/الإلغاء. احفظ السر الذي يظهر لمرة واحدة في مدير أسرار معتمد، لا في كود المتصفح أو نموذج أو قالب مستند أو تذكرة أو لقطة شاشة.
- ابدأ بطلب للقراءة فقط على سجل غير إنتاجي معتمد لا يحوي بيانات شخصية. احتفظ بقيمة
x-request-idمع دليل اختبار التكامل.
kayan_v1_؛ وهذا تنسيق تعريف فقط وليس منحاً للصلاحية. يمكن لرمز يبدو صحيحاً أن يكون منتهياً أو ملغى أو مملوكاً لعضو غير نشط أو غير قادر على الوصول إلى كيان.
عنوان الأساس والإصدار والتوثيق
استخدم مضيف KayanOS للمؤسسة المستهدفة ومسار الأساس v1:data، وتستخدم الأخطاء غلاف error.
خريطة نقاط النهاية
استبدل
:entityKey بمفتاح الكيان العائد من الاكتشاف، لا بعنوان عرض مترجم. واستبدل :recordId بمعرف سجل الواجهة؛ لا يلزم بادئة الكيان الداخلية، إن وُجدت، في هذا العنوان.
اكتشف العقد الفعلي أولاً
لا تخمن مفاتيح الحقول ولا تفترض أن كياناً داخلياً متاح. ابدأ بالاكتشاف واحفظ النتيجة مع إعداد التكامل.false أن التكامل لا يجوز أن يحاول ذلك الفعل؛ وليست دعوة لإعادة المحاولة بمرشح أوسع. عندما يملك الحقل قيد قراءة، قد يغيب عن قائمة الحقول ولا يجوز استخدامه في الترشيح أو الفرز عبر الواجهة العامة.
جلب السجلات والبحث والترشيح وتقسيم الصفحات
يقبل الجلب بـGET معاملات limit وcursor وsort وsearch. حجم الصفحة الافتراضي 100 والحد الأعلى 500. والفرز الافتراضي الأحدث أولاً حسب created. يستخدم فرز سلسلة الاستعلام قيم field:direction مفصولة بفواصل.
items وnextCursor. عامل nextCursor كقيمة معتمة: أرسلها كما هي مع الاستعلام المنطقي نفسه. لا تنشئ مؤشراً يدوياً ولا تفكّه لمنطق الأعمال ولا تعِد استخدامه مع فرز/مرشح تغيّر.
POST /records/query عندما يكون مرشح JSON أوضح أو أطول من عنوان URL. رشح وفرز الحقول القابلة للاستعلام العام فقط. مرشح المساواة البسيط مصفوفة من ثلاثة عناصر؛ وتستخدم المرشحات المركبة مصفوفتَي and أوor.
GET /entities/:entityKey؛ ولا تعد إلى جمع كل السجلات.
أنشئ السجلات عن قصد
يتطلب الإنشاء كائناً تحوي قيمتهdata كائناً آخر. تستمر قواعد التحقق من جانب الخادم وصلاحيات الكيان والحقول المطلوبة وقواعد دورة الحياة والتحقق من تكرار التسمية.
201 وغلاف السجل القابل للقراءة وETag عند وجود إصدار للسجل. وقد يعيد الإنشاء CREATED_RECORD_NOT_READABLE إذا استطاع مالك الرمز الإنشاء لكنه لا يستطيع قراءة السجل الجديد. عالج تصميم الصلاحية قبل افتراض فشل التكامل أو إعادة محاولة الإنشاء.
حدّث واحذف باستخدام ETag
اقرأ السجل قبل تغييره أو حذفه. تحمل استجابة القراءة ترويسةETag المشتقة من إصدار السجل. أرسل القيمة نفسها تماماً في If-Match عند PATCH أوDELETE.
If-Match إلزامية. يعيد غيابها 428 PRECONDITION_REQUIRED، ويعيد إصدار قديم 412 PRECONDITION_FAILED. تقبل الواجهة If-Match: * لكنها تتجاوز مقارنة الإصدار عمداً. استخدمها فقط عندما يقبل مالك تكامل موثق الكتابة فوق التغييرات المتزامنة؛ في سير العمل الخدمي العادي استخدم ETag الدقيق وأعد القراءة عند 412.
يعيد الحذف { "id", "entityKey", "deleted": true } فقط بعد فحوص الصلاحية والإصدار نفسها. ليست هذه نقطة حذف جماعي. أنشئ عملية مراجعة واحتفاظ قبل منح رمز فعل delete.
الحدود والترويسات وإعادة المحاولة
القيم الافتراضية المنشورة هي 60 محاولة توثيق لكل عنوان IP في الدقيقة و600 طلب لكل رمز في الدقيقة. يمكن للنشر تغييرها، لذا اقرأ ترويسات الاستجابة بدلاً من تثبيت رقم في العميل:
عند
429 انتظر على الأقل عدد ثواني retry-after وطبّق تراجعاً محدوداً. وعند 412 أعد قراءة السجل وقارن تغيير الأعمال ثم قرر إن كان التحديث ما زال صحيحاً. لا تعِد إنشاء أو حذفاً بشكل أعمى بعد مهلة: حدد أولاً هل نجح الطلب الأصلي باستخدام معرف آمن أو تسوية يراجعها المالك.
مرجع الحالات والأخطاء
مثال تكامل عملي: تقارير الطلبات المغلقة
لتكامل تقارير مركز خدمة:- تفعّل المؤسسة
service_requestsفقط للواجهة العامة وتمنح عضواً للتقارير فعلlistفي نطاق مركز الخدمة المناسب. - يستدعي التكامل
/meعند البدء، ويحفظ تلميح الرمز ومعرف الطلب في سجل تشغيلي محمي، ويتوقف إذا كانت المؤسسة أو المالك غير متوقعين. - يستعلم عن
status = closedومركز الخدمة المعتمد بالحد25، ثم يتبعnextCursorحتى اكتمال نافذة التقرير. - يحتفظ فقط بالحقول المعادة المطلوبة للتقرير، ولا يستنتج أو يجلب حقول مواطن أو مالية أو موظفين مخفية.
- إذا احتاج إلى تحديث حقل تديره التقارير، يقرأ السجل أولاً ويرسل
ETagالمعاد ثم يرسل تحديث{ "data": { … } }ضيقاً. عند412يعيد القراءة ويطلب من مالك التكامل حسم الحالة المتغيرة.
قائمة الأمان والإصدار
- استخدم رمزاً مسمىً واحداً لكل تكامل ولكل بيئة، ولا تشارك رمز شخص بين خدمات.
- امنح المالك أقل أفعال ونطاقات للكيانات، واختبر الرفض قصداً مثلما تختبر الوصول الناجح.
- اضبط تاريخ انتهاء ما لم تبرر متطلبات خدمة موثقة وعملية تدوير رمزاً بلا انتهاء.
- احفظ الأسرار في مخزن أسرار خادمي معتمد فقط. لا تشحنها في عميل ويب أو جوال.
- ألغ الرمز فوراً عند مغادرة مالكه أو تغير غرضه أو الاشتباه بتعرضه؛ الإلغاء يوقف عمله فوراً.
- سجّل نقطة النهاية والحالة ومعرف الطلب واسم/تلميح الرمز ومرجع سجل منقحاً، لا ترويسة Authorization ولا الرمز الكامل ولا حمولة حساسة.
- اختبر على سجل غير إنتاجي معتمد قبل تفعيل كتابات مجدولة في الإنتاج.

