أنت الآن بصدد الاطّلاع على مستندات Apigee Edge.
انتقِل إلى
مستندات Apigee X. info
المشكلة
يتلقّى تطبيق العميل رمز حالة HTTP بقيمة 500 Internal Server Error مع رمز الخطأ protocol.http.EmptyPath كاستجابة لطلبات البيانات من واجهة برمجة التطبيقات.
رسالة الخطأ
يتلقّى تطبيق العميل رمز الاستجابة التالي:
HTTP/1.1 500 Internal Server Error
بالإضافة إلى ذلك، قد تظهر لك رسالة الخطأ التالية:
{
"fault":{
"faultstring":"Request path cannot be empty",
"detail":{
"errorcode":"protocol.http.EmptyPath"
}
}
}الأسباب المحتملة
يحدث هذا الخطأ إذا كان عنوان URL الخاص بالطلب في خادم الخلفية، والذي يمثّله متغيّر التدفق
target.url، يحتوي على مسار فارغ.
وفقًا للمواصفات RFC 3986، القسم 3: عناصر البنية و RFC 3986، القسم 3.3: المسار:
يتضمّن بناء جملة معرّف الموارد المنتظم (URI) المكوّنات التالية:
foo://example.com:8042/over/there?name=ferret#nose \_/ \______________/\_________/ \_________/ \__/ | | | | | scheme authority path query fragment- المكوّن
pathهو مكوّن مطلوب ويجب أن يتضمّن دائمًا شرطة مائلة للأمام (/)، حتى إذا لم تكن هناك أحرف أخرى كجزء من المسار.
لذلك، إذا كان عنوان URL الخاص بالطلب في خادم الخلفية لا يتضمّن المكوّن path على الإطلاق، أي أنّه لا يتضمّن حتى شرطة مائلة للأمام (/)، ستستجيب Apigee Edge بالرمز 500 Internal Server Error ورمز الخطأ protocol.http.EmptyPath.
على سبيل المثال: إذا كانت قيمة target.url هي
https://www.mocktarget.apigee.net، سيحدث هذا الخطأ لأنّ
مكوِّن path فارغ أو مفقود.
| السبب | الوصف | تعليمات تحديد المشاكل وحلّها التي تنطبق على |
|---|---|---|
| يحتوي عنوان URL لخادم الخلفية (target.url) على مسار فارغ | يحتوي عنوان URL لخادم الخلفية الذي يمثّله متغيّر التدفق target.url على مسار فارغ. |
مستخدمو Edge Public Cloud وEdge Private Cloud |
خطوات التشخيص الشائعة
استخدِم إحدى الأدوات أو التقنيات التالية لتشخيص هذا الخطأ:
API Monitoring
الإجراء 1: استخدام "مراقبة واجهة برمجة التطبيقات"
لتشخيص الخطأ باستخدام "مراقبة واجهة برمجة التطبيقات"، اتّبِع الخطوات التالية:
- سجِّل الدخول إلى واجهة مستخدم Apigee Edge بصفتك مستخدمًا لديه دور مناسب.
انتقِل إلى المؤسسة التي تريد التحقيق في المشكلة فيها.

- انتقِل إلى صفحة تحليل > مراقبة واجهة برمجة التطبيقات > التحقيق.
- اختَر الفترة الزمنية المحدّدة التي لاحظت فيها الأخطاء.
رسم بياني لرمز الخطأ مقابل الوقت
اختَر خلية تحتوي على رمز الخطأ
protocol.http.EmptyPathكما هو موضّح أدناه:
تظهر المعلومات حول رمز الخطأ
protocol.http.EmptyPathكما هو موضح أدناه:
انقر على عرض السجلات لتوسيع صف الطلب الذي تعذّر تنفيذه.
- من نافذة السجلّات، سجِّل التفاصيل التالية:
- رمز الحالة:
500 - مصدر الخطأ:
target - رمز الخطأ:
protocol.http.EmptyPath
- رمز الحالة:
- إذا كان مصدر الخطأ هو
targetوكان رمز الخطأ هوprotocol.http.EmptyPath، يشير ذلك إلى أنّ عنوان URL لخادم الخلفية يتضمّن مسارًا فارغًا.
التتبّع
الإجراء رقم 2: استخدام أداة "التتبُّع"
لتشخيص الخطأ باستخدام "أداة التتبُّع"، اتّبِع الخطوات التالية:
- فعِّل جلسة التتبُّع، ثم اتّبِع إحدى الخطوتَين التاليتَين:
- انتظِر إلى أن يظهر الخطأ
500 Internal Server Error، أو - إذا كان بإمكانك إعادة إظهار المشكلة، أرسِل طلب بيانات من واجهة برمجة التطبيقات لإعادة إظهارها
500 Internal Server Error
- انتظِر إلى أن يظهر الخطأ
تأكَّد من تفعيل خيار عرض جميع معلومات FlowInfo:
- اختَر أحد الطلبات التي تعذّر تنفيذها وافحص التتبُّع.
- تنقَّل بين مراحل التتبُّع المختلفة وحدِّد مكان حدوث الخطأ.
سيظهر الخطأ عادةً في مسار بعد مرحلة بدء مسار الطلب المستهدَف كما هو موضّح أدناه:
دوِّن قيمة الخطأ من التتبُّع.
error: Request path cannot be empty
بما أنّ الخطأ يتم طرحه من خلال Apigee Edge بعد مرحلة بدء عملية طلب الاستهداف، يشير ذلك إلى أنّ
pathفي عنوان URL لخادم الخلفية فارغ. من المرجّح أن يحدث ذلك إذا تم تعديل المتغيّرtarget.url(الذي يمثّل عنوان URL لخادم الخلفية) باستخدام مسار فارغ من خلال إحدى السياسات في مسار الطلب.- افحص القسم المتغيرات التي تمّت قراءتها وتعيينها في كل مسار من الخلف بدءًا من نقطة الخطأ وصولاً إلى مرحلة بدء مسار الطلب المستهدف.
حدِّد السياسة التي يتم فيها تعديل متغيّر التدفق
target.url.نموذج تتبُّع يعرض سياسة JavaScript التي عدّلت متغيّر التدفق
target.url:
في نموذج التتبُّع الموضّح أعلاه، لاحظ قيمة المتغيّر flow
target.urlالتي تم تعديلها في سياسة JavaScript باسم SetTargetURL على النحو التالي:target.url : https://mocktarget.apigee.net
- يُرجى العِلم أنّ
target.urlيتضمّن المكوّنات التالية:- النظام:
https://mocktarget.apigee.net - المسار: فارغ
- النظام:
- لذلك، يظهر لك الخطأ
Request path cannot be empty. - انتقِل إلى مرحلة AX (تسجيل بيانات "إحصاءات Google") في التتبُّع وانقر عليها.
انتقِل للأسفل إلى قسم تفاصيل المرحلة - عناوين الأخطاء وحدِّد قيمتَي X-Apigee-fault-code وX-Apigee-fault-source كما هو موضّح أدناه:

- ستظهر قيمتا X-Apigee-fault-code وX-Apigee-fault-source بالشكلين
protocol.http.EmptyPathوtargetعلى التوالي، ما يشير إلى أنّ هذا الخطأ ناتج عن أنّ عنوان URL لخادم الخلفية يتضمّن مسارًا فارغًا.عناوين الاستجابة القيمة X-Apigee-fault-code protocol.http.EmptyPathX-Apigee-fault-source target
NGINX
الإجراء رقم 3: استخدام سجلات الوصول إلى NGINX
لتشخيص الخطأ باستخدام سجلّات الوصول إلى NGINX، اتّبِع الخطوات التالية:
- إذا كنت مستخدمًا في Private Cloud، يمكنك استخدام سجلات الوصول إلى NGINX لتحديد المعلومات الأساسية حول
500 Internal Server Errorعبر HTTP. تحقَّق من سجلّات الوصول إلى NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log- ابحث لمعرفة ما إذا كانت هناك أي أخطاء
500برمز الخطأprotocol.http.EmptyPathخلال مدة زمنية محددة (إذا حدثت المشكلة في الماضي) أو ما إذا كانت هناك أي طلبات لا تزال غير ناجحة مع500. إذا عثرت على أي أخطاء
500تطابق X-Apigee-fault-code القيمةprotocol.http.EmptyPath، حدِّد قيمة X-Apigee-fault-source.مثال على الخطأ 500 من سجلّ الوصول إلى NGINX:
يحتوي إدخال النموذج أعلاه من سجلّ الوصول إلى NGINX على القيم التالية لـ X- Apigee-fault-code وX-Apigee-fault-source:
العناوين القيمة X-Apigee-fault-code protocol.http.EmptyPathX-Apigee-fault-source targetلاحظ أنّ قيمتَي X-Apigee-fault-code وX-Apigee-fault-source هما
protocol.http.EmptyPathوtargetعلى التوالي، ما يشير إلى أنّ هذا الخطأ ناتج عن أنّ عنوان URL لخادم الخلفية يتضمّن مسارًا فارغًا.
السبب: يحتوي عنوان URL لخادم الخلفية (target.url) على مسار فارغ
التشخيص
- حدِّد رمز الخطأ ومصدر الخطأ لـ
500 Internal Server Errorباستخدام "مراقبة واجهة برمجة التطبيقات" أو "أداة التتبُّع" أو سجلّات الوصول إلى NGINX كما هو موضّح في خطوات التشخيص الشائعة. - إذا كان رمز الخطأ هو
protocol.http.EmptyPathوكان مصدر الخطأ يتضمّن القيمةtarget، يشير ذلك إلى أنّ عنوان URL لخادم الخلفية يتضمّن مسارًا فارغًا. يتم تمثيل عنوان URL لخادم الخلفية بواسطة متغيّر التدفق
target.urlفي Apigee Edge. يحدث هذا الخطأ عادةً إذا حاولت تعديل عنوان URL لخادم الخلفية، أيtarget.urlديناميكيًا باستخدام أي من السياسات (ضمن الخادم الوكيل/التدفق المشترك) في تدفق طلب الخادم المستهدف، بحيث يكون له مسار فارغ.- حدِّد ما إذا كان المتغيّر
target.urlفي مسار التنفيذ يتضمّن مسارًا فارغًا ومصدر قيمته باستخدام إحدى الخطوات التالية:التتبّع
استخدام أداة "التتبُّع"
إذا كنت قد سجّلت تتبُّعًا لهذا الخطأ، اتّبِع الخطوات الموضّحة في مقالة استخدام أداة التتبُّع ، ثم:
- تأكَّد مما إذا كان
target.urlيتضمّن مسارًا فارغًا. إذا كانت الإجابة "نعم"، عليك معرفة السياسة التي عدّلت قيمة
target.urlأو أضافت إليها مسارًا فارغًا.نموذج تتبُّع يعرض سياسة JavaScript التي عدّلت متغيّر التدفق
target.url:
- في نموذج التتبُّع أعلاه، لاحظ أنّ سياسة JavaScript قد عدّلت قيمة
target.urlأو أضافت إليها مسارًا فارغًا. - يُرجى العِلم أنّ
target.urlيتضمّن المكوّنات التالية:- النظام:
https://mocktarget.apigee.net - المسار: فارغ
- النظام:
السجلّات
استخدام السجلّات في خادم السجلّات
- إذا لم يكن لديك سجلّ تتبُّع لهذا الخطأ (مشكلة متقطّعة)، تحقَّق مما إذا كنت قد سجّلت المعلومات حول قيمة متغيّر التدفق
target.url، باستخدام سياسات مثل MessageLogging أو ServiceCallout إلى خادم السجلّ. - إذا كانت لديك السجلّات، راجِعها وقم بما يلي:
- تحقَّق مما إذا كان
target.urlيتضمّن مسارًا فارغًا، و - معرفة ما إذا كان بإمكانك تحديد السياسة التي تم تعديلها
target.urlلتتضمّن مسارًا فارغًا
- تحقَّق مما إذا كان
خادم وكيل لواجهة برمجة التطبيقات
مراجعة خادم وكيل واجهة برمجة التطبيقات الذي يتعذّر تنفيذه
إذا لم يكن لديك تتبُّع أو سجلّات لهذا الخطأ، راجِع خادم وكيل واجهة برمجة التطبيقات الذي تعذّر تنفيذه لتحديد ما تم تعديله أو تحديثه في متغيّر التدفق
target.urlليحتوي على مسار غير صالح. تحقق مما يلي:- السياسة داخل خادم وكيل لواجهة برمجة التطبيقات
- أي مسارات مشترَكة يتم استدعاؤها من الخادم الوكيل
- تأكَّد مما إذا كان
افحص السياسة المحدّدة (مثل AssignMessage أو JavaScript) التي تعدّل أو تحدّث متغيّر التدفق
target.urlبعناية وحدِّد سبب تعديلtarget.urlليصبح مسارًا فارغًا.في ما يلي بعض الأمثلة على السياسات التي تعدّل متغيّر التدفق
target.urlبشكل غير صحيح ليحتوي على مسار فارغ يؤدي إلى حدوث هذا الخطأ.العيّنة رقم 1
المثال 1: متغيّر
target.urlلتعديل سياسة JavaScriptvar url = "https://mocktarget.apigee.net" context.setVariable("target.url", url);
في المثال أعلاه، لاحظ أنّه يتم تعديل متغيّر التدفق
target.urlبالقيمةhttps://mocktarget.apigee.netالواردة في متغيّر آخرurl.يُرجى العِلم أنّ
target.urlيتضمّن المكوّنات التالية:- النظام:
https://mocktarget.apigee.net - المسار: فارغ
بما أنّ المسار فارغ، تعرض Apigee Edge الرمز
500 Internal Server Errorمع رمز الخطأprotocol.http.EmptyPath.النموذج رقم 2
المثال 2: متغيّر
target.urlلتعديل سياسة JavaScriptvar path = context.getVariable("request.header.Path"); var url = "https://mocktarget.apigee.net" + path context.setVariable("target.url", url);
في المثال أعلاه، لاحظ أنّه يتم تعديل متغيّر التدفق
target.urlمن خلال ربط القيمةhttps://mocktarget.apigee.netالواردة في المتغيّرurlبالقيمة للمتغيّرpathالآخر، والذي يتم استرداد قيمته منrequest.header.Path..إذا كان بإمكانك الوصول إلى الطلب أو التتبُّع الفعلي، يمكنك التحقّق من القيمة الفعلية التي تم تمريرها إلى
request.header.Path.طلب عيّنة مقدَّم من المستخدم:
curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token>
في هذا المثال، لا يتم إرسال مسار العنوان كجزء من الطلب. وبالتالي، تكون قيمة المتغيّر path في سياسة JavaScript هي
null.وبالتالي:
url = https://mocktarget.apigee.net + pathurl = https://mocktarget.apigee.net + nulltarget.url = https://mocktarget.apigee.netnull
يُرجى العِلم أنّ
target.urlيتضمّن المكوّنات التالية:- النظام:
https://mocktarget.apigee.netnull - المسار: فارغ
المثال 3
المثال 3: تعديل متغيّر
target.urlفي سياسة AssignMessage من خلال متغيّر آخر<AssignMessage async="false" continueOnError="false" enabled="true" name=">AM-SetTargetURL"> <DisplayName>AM-SetTargetURL</DisplayName> <AssignVariable> <Name>target.url</Name> <Value>https://mocktarget.apigee.net</Value> </AssignVariable> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
يُرجى العِلم أنّ
target.urlيتضمّن المكوّنات التالية:- النظام:
https://mocktarget.apigee.net - المسار: فارغ
في جميع الأمثلة أعلاه، يكون المسار في عنوان URL لخادم الخلفية، أي
target.url، فارغًا، وبالتالي تعرض Apigee Edge الرمز500 Internal Server Errorمع رمز الخطأprotocol.http.EmptyPath.- النظام:
الدقة
وفقًا للمواصفات
RFC 3986، القسم 2: مكونات البنية، فإنّ المكوّن path هو
مكوّن إلزامي ويجب أن يتضمّن دائمًا شرطة مائلة للأمام (/)، حتى إذا لم تكن هناك
أحرف أخرى كجزء من path. اتّبِع الخطوات التالية لحلّ هذه المشكلة:
- تأكَّد من أنّ عنوان URL لخادم الخلفية، الممثَّل بمتغير التدفق
target.url، يتضمّن دائمًا مسارًا غير فارغ.- في بعض الحالات، قد لا يتضمّن المسار اسم مورد، وفي هذه الحالة، احرص على أن يتضمّن المسار شرطة مائلة للأمام (
/) على الأقل. - إذا كنت تستخدم أي متغيّرات أخرى لتحديد قيمة متغيّر التدفق
target.url، فتأكَّد من أنّ المتغيّرات الأخرى لا تتضمّن مسارًا فارغًا. - إذا أجريت أي عمليات على السلاسل لتحديد قيمة متغيّر التدفق
target.url، فتأكَّد من أنّ نتيجة عمليات السلاسل لا تتضمّن مسارًا فارغًا.
- في بعض الحالات، قد لا يتضمّن المسار اسم مورد، وفي هذه الحالة، احرص على أن يتضمّن المسار شرطة مائلة للأمام (
- في النماذج الموضّحة في التشخيص، يمكنك حلّ هذه المشكلة كما هو موضّح أدناه:
العيّنة رقم 1
المثال 1: متغيّر
target.urlلتعديل سياسة JavaScriptأضِف شرطة مائلة للأمام (
/) إلى المتغيّرurlلإصلاح هذه المشكلة كما هو موضّح أدناه:var url = "https://mocktarget.apigee.net/" context.setVariable("target.url", url);
النموذج رقم 2
المثال 2: متغيّر
target.urlلتعديل سياسة JavaScriptvar path = context.getVariable("request.header.Path"); var url = "https://mocktarget.apigee.net" + path context.setVariable("target.url", url);
تأكَّد من إدخال مسار صالح، مثل
/iloveapisكجزء من عنوان الطلبPathلحلّ هذه المشكلة كما هو موضّح أدناه:نموذج طلب:
curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token> -H "Path: /iloveapis"
المثال 3
المثال 3: تعديل سياسة AssignMessage للمتغيّر
target.urlمن خلال متغيّر آخرأضِف مسارًا صالحًا في العنصر
<Value>لسياسة AssignMessage. على سبيل المثال، يمكنك استخدام/jsonكمسار MockTarget API. أي تعديل العنصر<Value>ليصبحhttps://mocktarget.apigee.net/jsonكما هو موضّح أدناه:<AssignMessage async="false" continueOnError="false" enabled="true" name="AM-SetTargetURL"> <DisplayName>AM-SetTargetURL</DisplayName> <AssignVariable> <Name>target.url</Name> <Value>https://mocktarget.apigee.net/json</Value> </AssignVariable> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <AssignTo createNew="false" transport="http" type="request"/> </AssignMessage>
المواصفات
تتوقّع Apigee Edge ألا يتضمّن عنوان URL الخاص بخادم الخلفية مسارًا فارغًا وفقًا للمواصفات التالية:
| المواصفات |
|---|
| RFC 3986، الفقرة 3: مكوّنات البنية |
| RFC 3986، الفقرة 3.3: المسار |
إذا كنت لا تزال بحاجة إلى أي مساعدة من فريق دعم Apigee، انتقِل إلى المعلومات التشخيصية التي يجب جمعها.
يجب جمع معلومات التشخيص
إذا استمرت المشكلة حتى بعد اتّباع التعليمات أعلاه، اجمع معلومات التشخيص التالية، ثم تواصَل مع فريق دعم Apigee Edge.
إذا كنت مستخدمًا لخدمة السحابة الإلكترونية العامة، يُرجى تقديم المعلومات التالية:
- اسم المؤسسة
- اسم البيئة
- اسم خادم وكيل لواجهة برمجة التطبيقات
- أكمِل الأمر
curlالمستخدَم لإعادة إنتاج500 Internal Server Errorمع رمز الخطأprotocol.http.EmptyPath - ملف التتبُّع لطلبات البيانات من واجهة برمجة التطبيقات
إذا كنت مستخدمًا في Private Cloud، يُرجى تقديم المعلومات التالية:
- رسالة الخطأ الكاملة التي تم رصدها للطلبات التي تعذّر تنفيذها
- اسم البيئة
- حِزمة خادم وكيل لواجهة برمجة التطبيقات
- ملف التتبُّع لطلبات البيانات من واجهة برمجة التطبيقات
سجلّات الوصول إلى NGINX:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_logحيث: يتم استبدال ORG وENV وPORT# بالقيم الفعلية.
- سجلّات نظام "معالج الرسائل"
/opt/apigee/var/log/edge-message- processor/logs/system.log