Call API
Το Call API επιτρέπει στην έρευνά σας να ανακτά δεδομένα από εξωτερική διαδικτυακή υπηρεσία και να χρησιμοποιεί την απόκριση για συμπλήρωση πεδίων ή επικύρωση απαντήσεων.
Η δυνατότητα Call API επιτρέπει σε ένα πεδίο έρευνας να κάνει αίτημα HTTP σε εξωτερική υπηρεσία και να χρησιμοποιεί την απόκριση για συμπλήρωση υπολογισμένης τιμής ή επικύρωση εισόδου χρήστη. Αυτό επιτρέπει αναζητήσεις πραγματικού χρόνου, επαλήθευση ID, αναζητήσεις barcode και οποιονδήποτε άλλο έλεγχο στην πλευρά του διακομιστή κατά τη συλλογή δεδομένων.
Υπάρχουν δύο συναρτήσεις:
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 | Χρόνος (ms) που παραμένει έγκυρη η αποθηκευμένη απόκριση πριν επαναφόρτωση |
| 9 | response_q | Όνομα πεδίου για αποθήκευση ακατέργαστου κωδικού HTTP απόκρισης (π.χ. ${response_status}) |
| 10 | call_type | (Προαιρετικό) Ειδική λειτουργία κλήσης: 'lazy-upload' ή 'lazy-upload-multiple' |
| 11 | post_body | (Προαιρετικό) Συμβολοσειρά σώματος POST. Αναφορά πεδίων φόρμας με ##fieldname## |
Παράδειγμα: Αίτημα GET για αναζήτηση νοικοκυριού βάσει ID
| type | name | label | appearance | calculation |
|---|---|---|---|---|
| text | household_id | ID νοικοκυριού | ||
| calculate | hh_name | callapi | callapi('GET', concat('https://api.example.com/households/', ${household_id}), 1, 3, 0, '$.name', 10000, 0, '') | |
| note | hh_display | Νοικοκυριό: ${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 εμφανίζει κουμπί “Ανάκτηση” που πατά χειροκίνητα ο απογραφέας.
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> |
Παράδειγμα: Επαλήθευση barcode έναντι μητρώου στοιχείων
| type | name | label | appearance | constraint | constraint_message |
|---|---|---|---|---|---|
| barcode | asset_code | Σαρώστε το barcode στοιχείου | callapi-verify | callapi-verify('POST', 'https://api.example.com/assets/verify', '$.valid', ". = 'true'", 10000, 'hard', '{"code": "##asset_code##"}') | Το στοιχείο δεν βρέθηκε στο μητρώο |
Εμφάνιση: callapi-verify(...)
Η στήλη appearance σε πεδίο με callapi-verify() στο constraint πρέπει να περιέχει callapi-verify(params) ή callapi-verify(dynamicParams) για να σηματοδοτήσει στο rtSurvey ότι αυτό το πεδίο χρησιμοποιεί επαλήθευση API.
Χρήση δεδομένων App API μαζί με callapi
Συνδυάστε callapi() με pulldata('app-api', 'user.token') για έγχυση του 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 ms) — μη χρησιμοποιείτε 0 ή πολύ υψηλές τιμές. - Ορίστε
allowed_auto=0για επαληθεύσεις που ο απογραφέας πρέπει να ενεργοποιήσει συνειδητά (π.χ. έλεγχοι ID). - Ορίστε
no_overwrite=1όταν το πεδίο μπορεί να επεξεργαστεί αργότερα και δεν θέλετε η επαναφόρτωση να αντικαταστήσει χειροκίνητες διορθώσεις. - Χρησιμοποιήστε
extract_exprμε συγκεκριμένο JSONPath αντί να βασίζεστε σε ακατέργαστο κείμενο απόκρισης. - Δοκιμάστε κλήσεις API σε λειτουργία εκτός σύνδεσης — το callapi θα αποτύχει ευγενικά και θα εμφανίσει σφάλμα, αλλά η φόρμα θα πρέπει να εξακολουθεί να μπορεί να συμπληρωθεί για μη κρίσιμα πεδία.
Περιορισμοί
- Απαιτεί συνδεσιμότητα δικτύου κατά τη διάρκεια της κλήσης — οι κλήσεις αποτυγχάνουν όταν η συσκευή είναι εκτός σύνδεσης.
- Οι αποκρίσεις API πρέπει να είναι JSON — οι αποκρίσεις XML ή απλού κειμένου απαιτούν πρόσθετη ανάλυση.
- Υψηλή συχνότητα κλήσεων (π.χ. μία κλήση API ανά παρουσία επανάληψης) μπορεί να επιβραδύνει την πλοήγηση φόρμας.