استدعاء API
تتيح ميزة Call API للاستطلاع جلب البيانات من خدمة ويب خارجية واستخدام الاستجابة لتعبئة الحقول أو التحقق من الإجابات.
تتيح ميزة Call API لحقل الاستطلاع تقديم طلب HTTP لخدمة خارجية واستخدام الاستجابة لتعبئة قيمة محسوبة أو التحقق من مدخلات المستخدم. يُتيح ذلك عمليات البحث في الوقت الفعلي، والتحقق من الهوية، والبحث عن الرموز الشريطية، وأي فحص آخر من جانب الخادم أثناء جمع البيانات.
توجد دالتان:
callapi()— تجلب قيمة من API وتخزنها في حقلcalculateأوtextcallapi-verify()— تستدعي API وتحظر التقدم إذا لم تتطابق الاستجابة مع القيمة المتوقعة (تُستخدم فيconstraint)
callapi() — جلب وتخزين استجابة API
الصياغة
ضع callapi() في عمود calculation لحقل calculate أو text:
callapi(method, url, allowed_auto, max_retry, no_overwrite, extract_expr, timeout, lifetime, response_q, call_type, post_body)
المعلمات
| # | المعلمة | الوصف |
|---|---|---|
| 1 | method | طريقة HTTP: 'GET' أو 'POST' |
| 2 | url | عنوان URL لنقطة نهاية API |
| 3 | allowed_auto | 1 للاستدعاء تلقائياً عند الوصول إلى الحقل؛ 0 لطلب زر تشغيل يدوي |
| 4 | max_retry | الحد الأقصى لعدد محاولات إعادة المحاولة عند الفشل |
| 5 | no_overwrite | 1 للاحتفاظ بالقيمة الموجودة إذا كان الحقل يحتوي على قيمة بالفعل؛ 0 للكتابة دائماً فوقها |
| 6 | extract_expr | تعبير JSONPath لاستخراج القيمة المطلوبة من الاستجابة (مثل $.data.name) |
| 7 | timeout | مهلة الطلب بالميلي ثانية |
| 8 | lifetime | المدة (بالميلي ثانية) التي تبقى فيها الاستجابة المخبأة صالحة قبل إعادة الجلب |
| 9 | response_q | اسم حقل لتخزين رمز استجابة HTTP الخام (مثل ${response_status}) |
| 10 | call_type | (اختياري) وضع الاستدعاء الخاص: 'lazy-upload' أو 'lazy-upload-multiple' |
| 11 | post_body | (اختياري) سلسلة جسم POST. استشر حقول النموذج باستخدام ##fieldname## |
مثال: طلب GET للبحث عن أسرة بمعرّفها
| type | name | label | appearance | calculation |
|---|---|---|---|---|
| text | household_id | Household ID | ||
| calculate | hh_name | callapi | callapi('GET', concat('https://api.example.com/households/', ${household_id}), 1, 3, 0, '$.name', 10000, 0, '') | |
| note | hh_display | Household: ${hh_name} |
مثال: طلب POST بجسم JSON
callapi('POST', 'https://api.example.com/lookup', 1, 2, 0, '$.result.value', 15000, 0, '', '', '{"id": "##household_id##"}')
في post_body، استخدم ##fieldname## لحقن القيمة الحالية لأي حقل نموذج.
المظهر: callapi
أضف callapi إلى عمود appearance للحقل لتمكين تكامل استدعاء API:
| type | name | label | appearance | calculation |
|---|---|---|---|---|
| calculate | api_result | callapi | callapi('GET', ...) |
عندما يكون allowed_auto هو 0، يعرض rtSurvey زر “Fetch” يضغط عليه المعدِّد يدوياً.
callapi-verify() — التحقق من قيمة مقابل API
يحظر callapi-verify() إرسال حقل حتى يؤكد API أن القيمة المُدخلة صالحة. استخدمه في عمود constraint.
الصياغة
callapi-verify(method, url, extract_expr, match_expr, timeout, constraint_mode, post_body, message)
المعلمات
| # | المعلمة | الوصف |
|---|---|---|
| 1 | method | طريقة HTTP: 'GET' أو 'POST' |
| 2 | url | نقطة نهاية API للتحقق |
| 3 | extract_expr | JSONPath لاستخراج القيمة المتوقعة من الاستجابة |
| 4 | match_expr | تعبير يقارن القيمة المستخرجة بقيمة الحقل (مثل $.status = 'valid') |
| 5 | timeout | مهلة الطلب بالميلي ثانية |
| 6 | constraint_mode | 'soft' لتحذير فقط؛ 'hard' لحظر التقدم |
| 7 | post_body | (اختياري) جسم POST مع استبدالات ##fieldname## |
| 8 | message | (اختياري) رسالة خطأ. يدعم تعدد اللغات: <en>Invalid!</en><vi>Không hợp lệ!</vi> |
مثال: التحقق من رمز شريطي مقابل سجل الأصول
| type | name | label | appearance | constraint | constraint_message |
|---|---|---|---|---|---|
| barcode | asset_code | Scan the asset barcode | callapi-verify | callapi-verify('POST', 'https://api.example.com/assets/verify', '$.valid', ". = 'true'", 10000, 'hard', '{"code": "##asset_code##"}') | Asset not found in registry |
المظهر: callapi-verify(...)
يجب أن يحتوي عمود appearance على حقل مع callapi-verify() في القيد على callapi-verify(params) أو callapi-verify(dynamicParams) للإشارة إلى rtSurvey بأن هذا الحقل يستخدم التحقق عبر API.
استخدام بيانات App API جنباً إلى جنب مع callapi
ادمج callapi() مع pulldata('app-api', 'user.token') لحقن رمز المستخدم المصادق عليه في طلب API:
callapi('POST', 'https://api.example.com/data', 1, 2, 0, '$.value', 10000, 0, '', '',
concat('{"token":"', pulldata('app-api','user.token'), '","id":"##item_id##"}'))
أفضل الممارسات
- اضبط دائماً
timeoutمعقولاً (5000–15000 مللي ثانية) — لا تستخدم 0 أو قيماً عالية جداً. - اضبط
allowed_auto=0للتحقق الذي يجب أن يُطلقه المعدِّد بوعي (مثل فحوصات الهوية). - اضبط
no_overwrite=1عندما يمكن تعديل الحقل لاحقاً ولا تريد إعادة الجلب لتغطية التصحيحات اليدوية. - استخدم
extract_exprمع JSONPath محدد بدلاً من الاعتماد على نص الاستجابة الخام. - اختبر استدعاءات API في وضع عدم الاتصال — سيفشل callapi بشكل رشيق ويُظهر خطأً، لكن يجب أن يظل النموذج قابلاً للإكمال للحقول غير الحرجة.
القيود
- يتطلب اتصالاً بالشبكة وقت الاستدعاء — ستفشل الاستدعاءات عندما يكون الجهاز غير متصل.
- يجب أن تكون استجابات API بتنسيق JSON — تتطلب استجابات XML أو النص العادي تحليلاً إضافياً.
- يمكن لتكرار الاستدعاء العالي (مثل استدعاء API واحد لكل مثيل تكرار) إبطاء التنقل في النموذج.