أنت الآن بصدد الاطّلاع على مستندات Apigee Edge.
انتقِل إلى
مستندات Apigee X. info
المشكلة
يتعذّر تنفيذ طلب البيانات من واجهة برمجة التطبيقات من خلال بوابة مخصّصة للمطوّرين المدمجة، ويظهر الخطأ
Unknown Error أو ردّ فارغ في لوحة
تجربة واجهة برمجة التطبيقات هذه.
رسائل الخطأ
قد يظهر ردّ فارغ أو رسالة الخطأ التالية لطلبات واجهة برمجة التطبيقات في البوابة المدمجة:
Unknown Error
في علامة التبويب أدوات المطوّرين > وحدة التحكّم، سيظهر لك الخطأ التالي:
Access to XMLHTTPRequest at 'API_URL' from origin 'URL_of_Integrated_DevPortal' has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header is present on the requested resource.
في ما يلي رسالة خطأ عامة كما تظهر في علامة التبويب "أدوات المطوّرين" > "وحدة التحكّم":
الأسباب المحتملة
| السبب | الوصف | تعليمات تحديد المشاكل وحلّها التي تنطبق على |
|---|---|---|
| خطأ في السياسة لم تتم معالجته | يتم إرسال استجابة الخطأ التلقائية بدون عناوين CORS، وذلك عندما تفشل أي سياسة في مسار وقت التشغيل لطلب بيانات من واجهة برمجة التطبيقات. | مستخدمو Edge Public Cloud |
| قيم متعدّدة لعنوان Access-Control-Allow-Origin | استخدام "إضافة" بدلاً من "ضبط" في "تعيين سياسة الرسائل" | مستخدمو Edge Public Cloud |
السبب: خطأ في السياسة لم تتم معالجته
التشخيص
- تأكَّد من أنّ المشكلة تحدث فقط إذا كان من المتوقّع تلقّي استجابة غير
2XX. - بالنسبة إلى الطلبات التي تعذّر تنفيذها، تحقَّق من توفّر سياسات في مسار الخادم الوكيل.
-
تتبُّع الطلب والتحقّق مما إذا كانت إحدى السياسات التي تتضمّن
continueOnError="false"قد تعذّر تنفيذها وأدّت إلى حدوث خطأ - إذا كانت الإجابة بنعم، تحقَّق مما إذا تم تنفيذ سياسة CORS الخاصة بـ AssignMessage في مسار استجابة الخطأ أم لا.
- إذا لم يكن كذلك، فهذا هو سبب المشكلة.
يرجع ذلك إلى أنّه عند تعذّر تنفيذ أي سياسة تتضمّن العنصرcontinueOnError="false"، ينتقل الطلب إلى مسار استجابة الخطأ. إذا لم تكن هناك أي معالجة صريحة للأخطاء في مسار الردود التي تتضمّن أخطاء، سيتم إرسال الرد التلقائي الذي يتضمّن الخطأ والمطابق للسياسة. لا تتضمّن استجابة الخطأ هذه أي عناوين CORS. نتيجةً لذلك، يتعذّر تنفيذ طلب البيانات من واجهة برمجة التطبيقات من بوابة المطوّرين المدمجة ويظهر الخطأUnknown error.
تعرض لقطات الشاشة التالية مثالاً على رسالة خطأ ومثالاً على رسالة نجاح.
مثال على رسالة الخطأ في لوحة تجربة واجهة برمجة التطبيقات هذه المدمجة في البوابة وفي نافذة التتبُّع الخاصة بالخادم الوكيل:
مثال على رسالة النجاح في لوحة تجربة واجهة برمجة التطبيقات هذه ضمن البوابة المدمجة وفي نافذة التتبُّع الخاصة بالخادم الوكيل:
الدقة
- بدلاً من الاعتماد على رسالة الخطأ التلقائية، يجب تنفيذ قاعدة خطأ للتعامل مع استجابة الخطأ. تضمين سياسة AssignMessage CORS مع العناوين المناسبة واستدعاؤها في FaultRule
- في بعض الأحيان، قد لا يكون من الممكن تحديد قاعدة خطأ لكل خطأ، وبالتالي، يمكن تنفيذ قاعدة خطأ تلقائية لتنفيذ سياسة CORS الخاصة بـ AssignMessage:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<ProxyEndpoint name="proxy-endpoint-name">
<Description/>
<!-- Add a default fault rule to add CORS -->
<DefaultFaultRule name="fault-rule">
<Step>
<Name>add-cors</Name>
</Step>
</DefaultFaultRule>
<FaultRules/>
<!--
<Flows />
Rest of the proxy definition
-->
</ProxyEndpoint>السبب: قيم متعدّدة لـ Access-Control-Allow-Origin
التشخيص
- تحقَّق من قيمة العنوان Access-Control-Allow-Origin في جلسة تتبُّع.
- يسمح عنوان Access-Control-Allow-Origin بتحديد قيمة واحدة فقط. قد يؤدي ضبط أكثر من قيمة واحدة إلى حدوث مشكلة في CORS، ولن تتمكّن بوابة مخصّصة للمطوّرين من عرض أي ردود.
- إذا كانت قيمة العنوان Access-Control-Allow-Origin في التتبُّع تبدو على النحو التالي:
*,*، يعني ذلك أنّ كلّاً من الخادم المستهدف وسياسة CORS الخاصة بـ AssignMessage يضبطان قيمته. - قد يحدث ذلك عندما يستخدم المستخدم
<Add> elementفي Access-Control-Allow-Origin ضمن إحدى السياسات، أو عندما يضبط الخلفية نفسها قيمًا متعدّدة.
مثال على Access-Control-Allow-Origin يساوي *,*:
مثال على Access-Control-Allow-Origin يساوي *:
مثال باستخدام <Add>:
مثال باستخدام <Set>:
الدقة
- الطريقة المقترَحة هي استخدام
<Set> element(بدلاً من<Add> element) في Access-Control-Allow-Origin لأنّه يُسمح بقيمة واحدة فقط. - بدلاً من ذلك، اضبط العنوان Access-Control-Allow-Origin في مكان واحد فقط، إما في سياسة CORS الخاصة بـ AssignMessage أو في الخادم المستهدف.
<?xml version="1.0" encoding="UTF-8" standalone="yes"?> <AssignMessage async="false" continueOnError="false" enabled="true" name="set-cors"> <DisplayName>Set CORS</DisplayName> <FaultRules/> <Properties/> <Set> <Headers> <Header name="Access-Control-Allow-Origin">*</Header> </Headers> </Set> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="response"/> </AssignMessage>
إذا كنت لا تزال بحاجة إلى أي مساعدة من فريق دعم Apigee، انتقِل إلى المعلومات التشخيصية التي يجب جمعها.
يجب جمع معلومات التشخيص
اجمع معلومات التشخيص التالية، ثم تواصَل مع فريق دعم Apigee Edge:
- اسم المؤسسة
- اسم البيئة
- اسم خادم وكيل لواجهة برمجة التطبيقات
- أكمل أمر curl المستخدَم لإعادة إنتاج الخطأ
- ملف التتبُّع لطلبات البيانات من واجهة برمجة التطبيقات
- الناتج الكامل للاستجابة من الخادم المستهدف/الخادم الخلفي، بالإضافة إلى حجم الحمولة