شما در حال مشاهده اسناد Apigee Edge هستید.
به مستندات Apigee X بروید . اطلاعات
علامت
برنامه سرویس گیرنده کد وضعیت HTTP 500 Internal Server Error را با protocol.http.EmptyPath کد خطا دریافت می کند.http.EmptyPath به عنوان پاسخی برای تماس های API.
پیغام خطا
برنامه مشتری کد پاسخ زیر را دریافت می کند:
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 رخ می دهد. path جزء خالی یا مفقود است
| علت | توضیحات | دستورالعمل های عیب یابی قابل اجرا برای |
|---|---|---|
| URL سرور بکاند (target.url) مسیر خالی دارد | URL سرور Backend که با متغیر جریان target.url نشان داده شده است دارای یک مسیر خالی است. | کاربران Edge Public و Private Cloud |
مراحل تشخیص رایج
برای تشخیص این خطا از یکی از ابزارها/تکنیک های زیر استفاده کنید:
مانیتورینگ API
روش شماره 1: استفاده از مانیتورینگ API
برای تشخیص خطا با استفاده از API Monitoring:
- به عنوان کاربر با نقش مناسب وارد رابط کاربری Apigee Edge شوید .
به سازمانی که میخواهید در آن موضوع را بررسی کنید بروید.

- به صفحه Analyze > API Monitoring > Investigate بروید.
- بازه زمانی خاصی را که در آن خطاها را مشاهده کرده اید انتخاب کنید.
کد خطا را در برابر زمان ترسیم کنید.
سلولی را انتخاب کنید که دارای
protocol.http.EmptyPathکد خطا باشد.http.EmptyPath مانند شکل زیر:
اطلاعات مربوط به
protocol.http.EmptyPathکد خطا.http.EmptyPath مطابق شکل زیر نمایش داده می شود:
روی View logs کلیک کنید تا ردیف درخواست ناموفق گسترش یابد.

- از پنجره Logs به جزئیات زیر توجه کنید:
- کد وضعیت:
500 - منبع خطا:
target - کد خطا:
protocol.http.EmptyPath
- کد وضعیت:
- اگر منبع خطا
targetباشد و کد خطاprotocol.http.EmptyPathباشد، این نشان میدهد که URL سرور backend یک مسیر خالی دارد.
ردیابی
روش شماره 2: با استفاده از ابزار Trace
برای تشخیص خطا با استفاده از ابزار Trace:
- جلسه ردیابی و یکی را فعال کنید
- صبر کنید تا خطای
500 Internal Server Errorرخ دهد یا - اگر میتوانید مشکل را تکرار کنید، با API تماس بگیرید تا
500 Internal Server Errorبازتولید شود.
- صبر کنید تا خطای
اطمینان حاصل کنید که نمایش همه FlowInfos فعال است:

- یکی از درخواست های ناموفق را انتخاب کنید و ردیابی را بررسی کنید.
- در مراحل مختلف ردیابی پیمایش کنید و محل وقوع شکست را پیدا کنید.
خطا را معمولاً در یک جریان پس از مرحله شروع جریان درخواست هدف ، مطابق شکل زیر خواهید دید:

به مقدار خطا از ردیابی توجه کنید.
خطا: مسیر درخواست نمی تواند خالی باشد
از آنجایی که این خطا توسط Apigee Edge پس از مرحله شروع جریان درخواست هدف مطرح می شود، نشان می دهد که
pathدر URL سرور باطن خالی است. اگر متغیر جریانtarget.url(که نشاندهنده URL سرور باطن است) احتمالاً با یک مسیر خالی از طریق یکی از خطمشیهای موجود در جریان درخواست بهروزرسانی شده باشد، به احتمال زیاد این اتفاق میافتد.- بخش Variables Read and Assigned در هر یک از جریانها را از نقطه خطا به سمت فاز شروع درخواست هدف بررسی کنید.
خط مشی را تعیین کنید که در آن متغیر جریان
target.urlبه روز می شود.ردیابی نمونه نشان دهنده خط مشی جاوا اسکریپت متغیر جریان
target.urlرا به روز کرد:
در نمونه ردیابی نشان داده شده در بالا، به مقدار متغیر flow
target.urlتوجه کنیدtarget.urlدر یک خط مشی جاوا اسکریپت به نام SetTargetURL به صورت زیر به روز می شود:target.url : https://mocktarget.apigee.net
- توجه داشته باشید که
target.urlدارای اجزای زیر است:- طرح:
https://mocktarget.apigee.net - مسیر: خالی
- طرح:
- بنابراین، با خطا مواجه میشوید.
Request path cannot be empty. - در Trace به فاز AX (Analytics Data Recorded) بروید و روی آن کلیک کنید.
به قسمت Phase Details - Error Headers بروید و مقادیر X-Apigee-fault-code و X-Apigee-fault-source را مطابق شکل زیر تعیین کنید:

- مقادیر X-Apigee-fault-code و X-Apigee-fault-source را به عنوان
protocol.http.EmptyPathوtargetخواهید دید.targetبه ترتیب، نشان می دهد که این خطا به این دلیل است که URL سرور باطن دارای یک مسیر خالی است.سرصفحه های پاسخ ارزش X-Apigee-fault-code protocol.http.EmptyPathX-Apigee-fault-source target
NGINX
روش شماره 3: استفاده از گزارش های دسترسی NGINX
برای تشخیص خطا با استفاده از گزارش های دسترسی NGINX:
- اگر کاربر Private Cloud هستید، می توانید از گزارش های دسترسی NGINX برای تعیین اطلاعات کلیدی مربوط به
500 Internal Server Errorاستفاده کنید. گزارش های دسترسی NGINX را بررسی کنید:
/opt/apigee/var/log/edge-router/nginx/ ORG ~ ENV . PORT# _access_log- جستجو کنید تا ببینید آیا
500خطا درprotocol.http.EmptyPathکد خطا وجود دارد.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هستند.targetبه ترتیب، نشان می دهد که این خطا به این دلیل است که URL سرور باطن دارای یک مسیر خالی است.
علت: URL سرور Backend (target.url) مسیر خالی دارد
تشخیص
- کد خطا و منبع خطا را برای
500 Internal Server Errorبا استفاده از API Monitoring، Trace Tool یا گزارش های دسترسی NGINX همانطور که در مراحل تشخیص رایج توضیح داده شده است، تعیین کنید. - اگر کد خطا
protocol.http.EmptyPathاست.http.EmptyPath و منبع خطا دارای مقدارtargetباشد، این نشان می دهد که URL سرور باطن دارای یک مسیر خالی است. URL سرور باطن با متغیر جریان
target.urlدر Apigee Edge نشان داده می شود. این خطا معمولاً در صورتی اتفاق میافتد که بخواهید URL سرور پشتیبان را بهروزرسانی کنید، یعنیtarget.urlبهصورت پویا با استفاده از هر یک از خطمشیها (در داخل پروکسی/جریان اشتراکگذاری شده) در جریان درخواست هدف، به طوری که یک مسیر خالی داشته باشد.- با استفاده از یکی از مراحل زیر مشخص کنید که آیا متغیر جریان
target.urlواقعاً دارای یک مسیر خالی و منبع مقدار آن است:ردیابی
با استفاده از ابزار Trace
اگر یک ردیابی برای این خطا ثبت کرده اید، از مراحلی که در Using Trace Tool توضیح داده شده است استفاده کنید:
- بررسی کنید که آیا
target.urlیک مسیر خالی دارد یا خیر. اگر بله، دریابید که کدام خط مشی مقدار
target.urlرا تغییر داده یا به روز کرده تا حاوی مسیر خالی باشد.ردیابی نمونه نشان دهنده خط مشی جاوا اسکریپت متغیر جریان
target.url:
- در ردیابی نمونه بالا، توجه کنید که خط مشی جاوا اسکریپت مقدار
target.urlرا تغییر داده یا به روز کرده است تا حاوی یک مسیر خالی باشد. - توجه داشته باشید که
target.urlدارای اجزای زیر است:- طرح:
https://mocktarget.apigee.net - مسیر: خالی
- طرح:
سیاههها
استفاده از گزارشها در سرور لاگ خود
- اگر ردیابی برای این خطا (یک مشکل متناوب) ندارید، سپس بررسی کنید که آیا اطلاعات مربوط به مقدار متغیر جریان
target.urlرا با استفاده از خطمشیهایی مانند MessageLogging یا ServiceCallout در سرور گزارش خود ثبت کردهاید یا خیر. - اگر گزارش ها را دارید، آنها را مرور کنید و:
- بررسی کنید که آیا
target.urlیک مسیر خالی دارد و - ببینید آیا می توانید تعیین کنید که کدام خط مشی تغییر یافته
target.urlحاوی یک مسیر خالی باشد
- بررسی کنید که آیا
پروکسی API
بررسی پروکسی API خراب
اگر ردیابی یا گزارشی برای این خطا ندارید، پروکسی API ناموفق را بررسی کنید تا تعیین کنید که چه چیزی متغیر جریان
target.urlرا تغییر داده یا بهروزرسانی کرده تا حاوی یک مسیر نامعتبر باشد. موارد زیر را بررسی کنید:- خط مشی در پروکسی API
- هر جریان مشترکی که از پروکسی فراخوانی شود
- بررسی کنید که آیا
خط مشی خاصی (به عنوان مثال AssignMessage یا جاوا اسکریپت) که متغیر جریان
target.urlرا تغییر می دهد یا به روز می کند را به دقت بررسی کنید و علت به روز رسانیtarget.urlرا برای داشتن یک مسیر خالی مشخص کنید.در اینجا چند نمونه از سیاستها وجود دارد که متغیر جریان
target.urlبه اشتباه بهروزرسانی میکنند تا حاوی یک مسیر خالی منتهی به این خطا باشد.نمونه شماره 1
نمونه شماره 1: متغیر
target.urlبه روز رسانی خط مشی جاوا اسکریپتvar 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کد خطا برمی گرداند.http.EmptyPath.نمونه شماره 2
نمونه شماره 2: متغیر
target.urlبه روز رسانی خط مشی جاوا اسکریپتvar 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متغیر به روز می شود.urlو مقدارpathمتغیر دیگری که مقدار آن ازrequest.header.Path .اگر به درخواست یا ردیابی واقعی دسترسی دارید، می توانید مقدار واقعی ارسال شده به
request.header.Pathرا تأیید کنید.نمونه درخواست ارائه شده توسط کاربر:
curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token>
در این مثال، مسیر هدر به عنوان بخشی از درخواست ارسال نمی شود. بنابراین، مقدار مسیر متغیر در خط مشی جاوا اسکریپت
nullاست.بنابراین:
-
url = https://mocktarget.apigee.net + path -
url = https://mocktarget.apigee.net + null -
target.url = https://mocktarget.apigee.netnull
توجه داشته باشید که
target.urlدارای اجزای زیر است:- طرح:
https://mocktarget.apigee.netnull - مسیر: خالی
نمونه شماره 3
نمونه شماره 3: AssignMessage Policy به روز رسانی متغیر
target.urlاز طریق متغیر دیگری<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 سرور backend، یعنی
target.urlخالی است، بنابراین Apigee Edge500 Internal Server Errorباprotocol.http.EmptyPathکد خطا برمیگرداند.http.EmptyPath.- طرح:
قطعنامه
طبق مشخصات RFC 3986، بخش 2: اجزای نحوی ، مؤلفه path مورد نیاز است و باید همیشه یک اسلش رو به جلو (/) داشته باشد، حتی اگر هیچ کاراکتر دیگری به عنوان بخشی از path وجود نداشته باشد. برای رفع این مشکل مراحل زیر را انجام دهید:
- اطمینان حاصل کنید که URL سرور پشتیبان که با متغیر جریان
target.urlنشان داده می شود همیشه یک مسیر غیر خالی داشته باشد.- در برخی موارد، ممکن است نام منبعی در مسیر نداشته باشید، سپس مطمئن شوید که مسیر حداقل دارای یک اسلش رو به جلو (
/) باشد. - اگر از هر متغیر دیگری برای تعیین مقدار متغیر جریان
target.urlاستفاده میکنید، مطمئن شوید که سایر متغیرها مسیر خالی ندارند. - اگر عملیات رشته ای را برای تعیین مقدار متغیر جریان
target.urlانجام می دهید، مطمئن شوید که نتیجه یا نتیجه عملیات رشته مسیر خالی ندارد.
- در برخی موارد، ممکن است نام منبعی در مسیر نداشته باشید، سپس مطمئن شوید که مسیر حداقل دارای یک اسلش رو به جلو (
- در نمونه های مورد بحث در Diagnosis ، می توانید این مشکل را همانطور که در زیر توضیح داده شده است برطرف کنید:
نمونه شماره 1
نمونه شماره 1: متغیر
target.urlبه روز رسانی خط مشی جاوا اسکریپتبرای رفع این مشکل مانند شکل زیر، یک اسلش رو به جلو (
/) بهurlمتغیر اضافه کنید:var url = "https://mocktarget.apigee.net/" context.setVariable("target.url", url);
نمونه شماره 2
نمونه شماره 2: متغیر
target.urlبه روز رسانی خط مشی جاوا اسکریپتvar 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 Policy به روز رسانی متغیر
target.urlاز طریق متغیر دیگرییک مسیر معتبر در عنصر
<Value>سیاست AssignMessage اضافه کنید. به عنوان مثال، می توانید/jsonداشته باشید/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 نیاز دارید، به Must collect information diagnostic بروید.
باید اطلاعات تشخیصی را جمع آوری کرد
اگر حتی پس از پیروی از دستورالعملهای بالا، مشکل همچنان ادامه داشت، اطلاعات تشخیصی زیر را جمعآوری کنید و سپس با پشتیبانی Apigee Edge تماس بگیرید.
اگر کاربر Public Cloud هستید، اطلاعات زیر را ارائه دهید:
- نام سازمان
- نام محیط زیست
- نام پروکسی API
- دستور کامل
curlکه برای بازتولید500 Internal Server Errorباprotocol.http.EmptyPathکد خطا استفاده می شود.http.EmptyPath - فایل ردیابی برای درخواست های API
اگر کاربر Private Cloud هستید، اطلاعات زیر را ارائه دهید:
- پیام خطای کامل برای درخواست های ناموفق مشاهده شد
- نام محیط زیست
- بسته پروکسی API
- فایل ردیابی برای درخواست های API
گزارش های دسترسی 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