نشر واجهة برمجية مخصصة
الهدف
امنح نظام شركة أخرى عنواناً واحداً يستدعيه — POST /api/par/v1/invoices/{id}/approve —
واجعل ذلك العنوان يعمل بالطريقة نفسها بعد أن تعيد تسمية عمود.
لماذا يوجد هذا
لدى بارسوير أصلاً واجهة برمجية لجداولك، مُولَّدة من بيانات الجدول الوصفية، ما يعني أن شكلها
يتغير كلما تغير الجدول. هذا بالضبط ما تريده داخل المنصة، وبالضبط ما يجب ألّا تسلّمه لمن هو
خارجها: لقد كتب شفرته على أساس شكل معيّن، ولن يعيد كتابتها لأنك غيّرت اسم par_total إلى
par_amount.
الواجهة المخصصة وعدٌ بأن يحافظ المسار على شكله بينما تتغير الجداول خلفه.
وهي مكوّن من مكوّنات حلّك، كالنموذج أو العرض: تُؤلَّف في بيئة التطوير، وتسافر داخل حزمة الحل، وتستجيب في بيئتَي الاختبار والإنتاج لأنك استوردتها هناك.
قبل أن تبدأ
- حلّ، وله ناشر (تصبح بادئة الناشر جزءاً من كل مسار تنشره).
- الجدول الذي تريد كشفه، إن كانت هذه الواجهة عن جدول.
- تسجيل تطبيق للنظام الذي سيستدعيك، يحمل النطاق الذي أنت على وشك اشتراطه. تسجيله من عمل المسؤول — تسجيل تطبيق خارجي.
الخطوات
- افتح حلّك واختر الواجهات البرمجية المخصصة.
- اختر جديد.
- أعطها اسم عرض. سيُملأ الاسم المنطقي تلقائياً مسبوقاً ببادئة ناشرك.
- اترك الإصدار على 1. سترفعه لاحقاً، وسيظل الإصدار القديم مستجيباً ريثما يلحق من يستدعيك.
- اختر الأسلوب واكتب المسار — بلا شرطة مائلة في البداية. المقطع بين قوسين معقوفين
معاملُ مسار:
invoices/{id}/approve. تعرض الشاشة العنوان الكامل وأنت تكتب. - اختر النطاق المطلوب — النطاق الذي يجب أن يحمله تسجيل تطبيق النظام المستدعي، مثل
modelapps.read. وهو قائمة لا مربع نص: نطاق لا يُمنح لأحد يرفض كل استدعاء، ولن تعرف بذلك حتى يصطدم به شريك. - اختر بماذا يجيب — JSON أو نص أو HTML. انظر القسم أدناه؛ فهذا الاختيار يحدد أيضاً النص البدئي، لذا حدّده قبل كتابة أي شفرة.
- مخطط الطلب ومخطط الاستجابة اختياريان. إن تُركا فارغين يُقرأ العقد من نصّك البرمجي — كل
getInputيقرؤه وكلsetOutputيضبطه — ويُنشر في مستند OpenAPI. اكتب مخطط JSON فقط لتكون أكثر صرامة (الأنواع، الحقول المطلوبة، الحدود)؛ مخطط الطلب المكتوب يُفحص في كل استدعاء، فيُرفض الطلب المشوّه عند الباب. - أبقِ مستجيبة مؤشَّرة، ثم احفظ.
- اختر الصف واضغط تحرير الشفرة. تحلّ المحرّرة محل القائمة — وهنا يعيش سلوك هذه الواجهة، مكتوباً بـ BS Lang. اضغط العين لترى كل دالة يمكنك استدعاؤها. احفظ ثم أغلق.
بماذا تجيب
تجيب الواجهة البرمجية المخصصة بواحد من ثلاثة، وأنت تختار أيّها على العقد:
| تجيب بـ | يكتب النص | مناسب لـ |
|---|---|---|
| JSON | setOutput("name", value) لكل حقل | نظام آخر يقرأ بياناتك |
| نص | setBody("...") | سطر واحد — مرجع أو رمز أو سطر CSV |
| HTML | setBody("<p>...</p>") | رسالة تأكيد، أو صفحة يفتحها المتصفح |
setOutput("reference", "BOOKING-42"); // JSON: { "reference": "BOOKING-42" }
setBody("BOOKING-42"); // نص أو HTML: هذا بالضبط، ولا شيء غيره
استخدم واحداً منهما، لا كليهما أبداً. النص الذي يستدعي setOutput و setBody يُرفض عند
التشغيل بدل أن يفوز أحدهما بصمت — فالإجابة التي لا تستطيع تفسيرها أسوأ من خطأ تستطيع قراءته.
وتأتي معهما دالتان أخريان:
setStatus(404)— الحالة التي تريد الإجابة بها. وهي تختلف عنthrowValidationErrorالتي تعني أن المستدعي أخطأ (خطأ ٤٠٠)؛ أماsetStatusفهو قرار عقدك أنت. ويجب ألّا تحمل204جسماً.setContentType("html")— يغيّر النوع لاستدعاء واحد. ولا تحتاجه معظم الواجهات، لأن العقد يعلن أصلاً بماذا تجيب.
لماذا يعلنه العقد لا شفرتك وحدها: تُولَّد وثيقة OpenAPI قبل أن يستدعيك أحد، فلا تستطيع أن تصف إلا ما يقوله العقد. أعلن HTML فتقول الوثيقة HTML؛ واتركه JSON فيكتب المتكامل محلل JSON حول صفحتك.