FlutterFlow
FlutterFlow يُترجم إلى تطبيق يحملُه المستخدم الخاص بك، لذا السؤال ليس عن الحقول التي يجب ملؤها، بل عن مكان ظهور المفتاح. الطلب أدناه أُرسل إلى الإنتاج بنفس الشكل الذي يُنشئه النداء؛ الخطوات في FlutterFlow مكتوبة وفق وثائق FlutterFlow حتى 2026-09-17.
أولاً أنشئ مفتاحًا كما هو موضح في القسم المفتاح للأتمتة، مع النطاق chart.
1. أنشئ النداء
Section titled “1. أنشئ النداء”افتح API Calls، اضغط + Add، اختر Create API Call واملأ:
-
API Call Name:
Natal chart. -
Method Type:
POST. -
URL:
https://api.astroway.info/v1/chart -
تبويب Headers، + Add Header: سطر واحد
X-Api-Key:ثم مفتاحك. السطر الثانيContent-Type: application/json. -
تبويب Variables: خمس متغيّرات من نوع String،
date,time,timezone,latitude,longitude، كل واحدة بقيمة افتراضية من JSON أدناه. -
تبويب Body، في القائمة المنسدلة JSON: الصق JSON واسحب المتغيّرات إليه.
{ "date": "1990-05-15", "time": "14:30:00", "timezone": "Europe/Kyiv", "latitude": "50.45", "longitude": "30.52"}خط العرض والطول يبقيان كسلاسل عن قصد: API يقبل "50.45" كعدد، والسلسلة تسهّل سحب المتغيّرات.
اضغط Add Call، افتح Response & Test، اضغط Test API Call وشاهد الرد في Test Response. data.input.timezoneOffset يُرجع كـ 4: هذا هو الانحراف الذي كان لدى كييف في ذلك التاريخ.
2. اجعل النداء خاصًا
Section titled “2. اجعل النداء خاصًا”في Advanced Settings للنداء فعل Make Private، اضغط Save، ثم Deploy APIs. الآن يُنفّذ النداء في Firebase Cloud Function، لذا يحتاج المشروع إلى Firebase متصل وخطة Firebase تشمل Cloud Functions.
هناك أمران آخران تقولهما وثائق FlutterFlow صراحةً: المفتاح المرسل من الواجهة الأمامية، مثلًا عبر remote config، يبقى مكشوفًا حتى في النداء الخاص، والشكل الآمن هو رأس (header) مضمّن في النداء نفسه.
3. اقرأ الرد
Section titled “3. اقرأ الرد”في JSON Paths اضغط + Add JSON Path وأعط كل واحد اسمًا:
| الاسم | JSON Path |
|---|---|
ascendant | $.data.houses.ascendant |
sunLongitude | $.data.planets[0].longitude |
moonLongitude | $.data.planets[1].longitude |
offsetUsed | $.data.input.timezoneOffset |
الإشارة هي الطول مقسومًا على 30 ومقربًا للأسفل، كفهرس في قائمة من اثني عشر اسمًا: على سبيل المثال Ascendant 159.26 يعطي 5، أي العذراء. يكفي دالة مخصصة من أربع أسطر أو قائمة من اثني عشر سطرًا والفهرس.
لا يمكن لتجميع الويب الاتصال بنا من المتصفح
Section titled “لا يمكن لتجميع الويب الاتصال بنا من المتصفح”تم القياس في 2026-09-17 من صفحة على نطاق خارجي: POST /v1/chart يرد على preflight بدون رأس access-control-allow-origin، وChrome يحظر الطلب. المتصفح على نطاق آخر يرد فقط على /v1/public/* و /v1/embed/*.
FlutterFlow يجرِّي النداءات عبر بروكسي خاص به في المصمم، في وضع Run و Test، لذا النداء الذي يعمل هناك قد يفشل بعد نشر تطبيق الويب. هناك حلّان، ونحن نوصي بالأول:
- اجعل النداء خاصًا، كما في الأعلى. عندها يُنفّذ في Cloud Function، وليس في المتصفح، وهذا يزيل فورًا كل من مشكلة المفتاح ومشكلة CORS.
- ضع خلفية خاصة أمامنا، إذا كان لديك واحدة بالفعل. إعدادات البروكسي في FlutterFlow، مع proxy URL الخاص، موثقة للمصمم ووضعيات Run و Test؛ لا تتحدث الوثائق عن تجميع الويب المنشور، لذا لا تعتمد عليها هناك.
المفتاح العام pk_ لا يحل هذه المشكلة: فهو يتيح فقط /v1/public/* و /v1/embed/*، ومن تجميعات iOS و Android يُرفض تمامًا لأنه لا يرسل web-origin.
الأخطاء
Section titled “الأخطاء”401في نداء خاص: المفتاح موجود على المجموعة، وليس على النداء.400 INVALID_FIELDمعtimezoneفيdetails: المنطقة فارغة، يجب أن تكون اختصارًا مثلESTأو اسم منطقة.400معdateأوtimeفيdetails: الصيغة ليستYYYY-MM-DD/HH:MM:SS.403 ENDPOINT_NOT_IN_SCOPE: النطاقchartغير موجود في مجال المفتاح.429 KEY_BUDGET_EXHAUSTED: المفتاح استهلك ميزانيته؛ قم بزيادة الميزانية في لوحة التحكم.