درحال مشاهده اسناد Apigee Edge هستید.
به
اسناد Apigee X بروید. اطلاعات
نشانه
برنامه مشتری کد وضعیت HTTP 500 Internal Server Error را با
کد خطای protocol.http.EmptyPath بهعنوان پاسخ برای تماسهای API دریافت میکند.
پیام خطا
برنامه کارخواه کد پاسخ زیر را دریافت میکند:
HTTP/1.1 500 Internal Server Error
علاوهبراین، ممکن است پیام خطای زیر را مشاهده کنید:
{
"fault":{
"faultstring":"Request path cannot be empty",
"detail":{
"errorcode":"protocol.http.EmptyPath"
}
}
}علل احتمالی
این خطا زمانی رخ میدهد که نشانی وب درخواست سرور زیرینه، که با متغیر جاری نشان داده میشود
target.url، حاوی مسیر خالی باشد.
طبق مشخصات RFC 3986، بخش ۳: مؤلفههای دستور زبان و RFC 3986، بخش ۳.۳: مسیر:
نحو URI دارای عناصر زیر است:
foo://example.com:8042/over/there?name=ferret#nose \_/ \______________/\_________/ \_________/ \__/ | | | | | scheme authority path query fragment- عنصر
pathالزامی است و همیشه باید خط مورب (/) داشته باشد، حتی اگر نویسههای دیگری بهعنوان بخشی از مسیر وجود نداشته باشد.
بنابراین، اگر نشانی وب درخواست سرور پشتیبان اصلاً مؤلفه path
را نداشته باشد، یعنی حتی خط مورب (/) هم نداشته باشد، Apigee
Edge با 500 Internal Server Error و کد خطای
protocol.http.EmptyPath پاسخ میدهد.
برای مثال: اگر target.url مقدار
https://www.mocktarget.apigee.net را داشته باشد، این خطا رخ میدهد زیرا
path عنصر خالی است یا وجود ندارد.
| علت | شرح | دستورالعملهای عیبیابی برای موارد زیر قابلاجرا است |
|---|---|---|
| نشانی وب سرور پشتیبان (target.url) مسیر خالی دارد | نشانی وب سرور «پشتیبان» که با متغیر جریان target.url نشان داده میشود مسیر خالی دارد. |
کاربران «فضای ابری خصوصی و عمومی لبهای» |
مراحل متداول تشخیص خرابی
برای تشخیص این خطا، از یکی از ابزارها/تکنیکهای زیر استفاده کنید:
پایش میانای برنامهسازی کاربردی
رویه شماره ۱: استفاده از «پایش میانای برنامهسازی کاربردی»
برای تشخیص خطا بااستفاده از «پایش API»:
- بهعنوان کاربری با نقش مناسب به سیستم Apigee Edge UI وارد شوید.
به سازمانی که میخواهید مشکل را در آن بررسی کنید بروید.

- به صفحه تجزیهوتحلیل > پایش API > بررسی پیمایش کنید.
- بازه زمانی خاصی را که در آن خطاها را مشاهده کردهاید انتخاب کنید.
رسم کد خطا دربرابر زمان.
سلولی را که کد خطای
protocol.http.EmptyPathرا دارد، همانطور که در زیر نشان داده شده است، انتخاب کنید:
اطلاعات مربوط به کد خطا
protocol.http.EmptyPathبهصورت زیر نمایش داده میشود:
روی مشاهده گزارشها کلیک کنید تا ردیف درخواست ناموفق ازهم باز شود.
- از پنجره گزارشها، جزئیات زیر را یادداشت کنید:
- کد وضعیت:
500 - منبع خطا:
target - کد خطا:
protocol.http.EmptyPath
- کد وضعیت:
- اگر منبع خطا
targetو کد خطاprotocol.http.EmptyPathباشد، این نشان میدهد که نشانی وب سرور زیرینه مسیر خالی دارد.
ردیابی
رویه شماره ۲: استفاده از ابزار «ردیابی»
برای تشخیص خرابی بااستفاده از ابزار «ردیابی»:
- جلسه ردیابی و یکی از این موارد را فعال کنید
- منتظر بمانید تا خطای
500 Internal Server Errorرخ دهد، یا - اگر میتوانید مشکل را بازتولید کنید، برای بازتولید مشکل، تماس API برقرار کنید
500 Internal Server Error
- منتظر بمانید تا خطای
مطمئن شوید که نمایش همه FlowInfos فعال باشد:
- یکی از درخواستهای ناموفق را انتخاب کنید و ردیابی را بررسی کنید.
- در مراحل مختلف ردیابی پیمایش کنید و مکان وقوع خطا را پیدا کنید.
معمولاً خطا را در جاریسازی پساز مرحله جاریسازی درخواست هدف شروع شد همانطور که در زیر نشان داده شده است پیدا خواهید کرد:
مقدار خطا را از ردیابی یادداشت کنید.
خطا: مسیر درخواست نمیتواند خالی باشد
ازآنجاییکه این خطا توسط Apigee Edge پساز مرحله جریان درخواست هدف شروع شد ایجاد میشود، این خطا نشان میدهد که
pathدر نشانی وب سرور زیرینه خالی است. این اتفاق بهاحتمال زیاد زمانی رخ میدهد که متغیر جاریسازیtarget.url(که نشاندهنده نشانی وب سرور زیرینه است) احتمالاً ازطریق یکی از خطمشیهای جاریسازی درخواست با مسیر خالی بهروز شده باشد.- بخش متغیرهای خواندهشده و اختصاصدادهشده را در هریک از جریانها از نقطه خطا بهسمت مرحله جریان درخواست هدف شروع شد بررسی کنید.
خطمشیای را که در آن متغیر جریان
target.urlبهروزرسانی میشود تعیین کنید.نمونه ردیابی که نشان میدهد خطمشی جاوا اسکریپت متغیر جریان
target.urlرا بهروز کرده است:
در ردیابی نمونه نشاندادهشده در بالا، به مقدار متغیر جریان توجه کنید
target.urlدر خطمشی جاوا اسکریپت بهنام SetTargetURL بهصورت زیر بهروزرسانی میشود:target.url : https://mocktarget.apigee.net
- توجه داشته باشید که
target.urlدارای اجزای زیر است:- طرح:
https://mocktarget.apigee.net - مسیر: خالی
- طرح:
- بنابراین، خطای
Request path cannot be emptyرا دریافت میکنید. - به فاز AX (دادههای Analytics ضبطشده) در ردیابی بروید و روی آن کلیک کنید.
به بخش جزئیات فاز - سرایندهای خطا پیمایش کنید و مقادیر X-Apigee-fault-code و X-Apigee-fault-source را همانطور که در زیر نشان داده شده است تعیین کنید:

- مقادیر X-Apigee-fault-code و X-Apigee-fault-source را بهترتیب
protocol.http.EmptyPathوtargetخواهید دید که نشان میدهد این خطا بهدلیل خالی بودن مسیر نشانی وب سرور زیرینه ایجاد شده است.سرایندهای پاسخ مقدار X-Apigee-fault-code protocol.http.EmptyPathX-Apigee-fault-source target
NGINX
رویه شماره ۳: استفاده از گزارشهای دسترسی NGINX
برای تشخیص خطا بااستفاده از گزارشهای دسترسی NGINX:
- اگر کاربر «ابر خصوصی» هستید، میتوانید از گزارشهای دسترسی NGINX برای تعیین
اطلاعات کلیدی درباره
500 Internal Server ErrorHTTP استفاده کنید. گزارشهای دسترسی 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 را تعیین کنید.نمونه خطای ۵۰۰ از گزارش دسترسی 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) مسیر خالی دارد
تشخیص
- کد خطا و منبع خطا را برای
500 Internal Server Errorبااستفاده از «پایش میانای برنامهسازی کاربردی»، «ابزار ردیابی»، یا گزارشهای دسترسی NGINX که در مراحل تشخیص خرابی رایج توضیح داده شده است تعیین کنید. - اگر کد خطا
protocol.http.EmptyPathباشد و منبع خطا مقدارtargetرا داشته باشد، این نشان میدهد که نشانی وب سرور زیرینه مسیر خالی دارد. نشانی وب سرور زیرینه با متغیر جریان
target.urlدر Apigee Edge نشان داده میشود. این خطا معمولاً زمانی رخ میدهد که بخواهید نشانی وب سرور پشتیبان را، یعنیtarget.urlبهصورت پویا بااستفاده از هریک از خطمشیها (در جریان مشترک/پراکسی) در جریان درخواست «هدف» بهروز کنید، بهطوری که مسیر خالی داشته باشد.- بااستفاده از یکی از مراحل زیر، تعیین کنید که آیا متغیر جریان
target.urlواقعاً مسیر خالی دارد و منبع مقدار آن چیست:ردیابی
استفاده از ابزار ردیابی
اگر ردیابی برای این خطا ضبط کردهاید، از مراحل توضیحدادهشده در استفاده از «ابزار ردیابی» و: استفاده کنید
- بررسی کنید که آیا
target.urlمسیر خالی دارد یا نه. اگر بله، پس ببینید کدام خطمشی مقدار
target.urlرا تغییر داده یا بهروز کرده است تا مسیر خالی را دربر بگیرد.نمونه ردگیری که نشان میدهد خطمشی جاوا اسکریپت متغیر جاری را بهروزرسانی کرده است
target.url:
- در ردیابی نمونه بالا، توجه کنید که خطمشی جاوا اسکریپت مقدار
target.urlرا تغییر داده یا بهروز کرده است تا حاوی مسیر خالی باشد. - توجه داشته باشید که
target.urlدارای اجزای زیر است:- طرح:
https://mocktarget.apigee.net - مسیر: خالی
- طرح:
گزارشها
استفاده از گزارشها در سرور گزارش
- اگر ردیابی برای این خطا (مشکلی که گاهی پیش میآید) ندارید، بررسی کنید که آیا اطلاعات مربوط به مقدار متغیر جاریسازی
target.urlرا بااستفاده از خطمشیهایی مثل MessageLogging یا ServiceCallout در سرور گزارش ثبت کردهاید یا نه. - اگر گزارشها را دارید، آنها را مرور کنید و:
- بررسی کنید که آیا
target.urlمسیر خالی دارد، و - ببینید میتوانید تشخیص دهید کدام خطمشی
target.urlرا بهگونهای تغییر داده است که مسیر خالی داشته باشد
- بررسی کنید که آیا
پراکسی میانای برنامهسازی کاربردی
درحال بررسی پراکسی میانای برنامهسازی کاربردی ناموفق
اگر ردیابی یا گزارشهای این خطا را ندارید، کارگزار میانای برنامهسازی کاربردی ناموفق را مرور کنید تا مشخص شود چه چیزی متغیر جاری
target.urlرا تغییر داده یا بهروزرسانی کرده است تا حاوی مسیر نامعتبر باشد. مراحل زیر را بررسی کنید:- خطمشی درون پراکسی API
- هر جریانی که از پراکسی فراخوانی شده است
- بررسی کنید که آیا
خطمشی خاصی را که متغیر جریان
target.urlرا اصلاح یا بهروزرسانی میکند (برای نمونه، AssignMessage یا JavaScript) بهدقت بررسی کنید و دلیل بهروزرسانیtarget.urlبرای داشتن مسیر خالی را تعیین کنید.در اینجا چند خطمشی نمونه آورده شده است که متغیر جاری
target.urlرا بهاشتباه بهروزرسانی میکند تا حاوی مسیر خالی منتهی به این خطا باشد.نمونه شماره ۱
نمونه شماره ۱: بهروزرسانی خطمشی جاوا اسکریپت متغیر
target.urlvar 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برمیگرداند.نمونه شماره ۲
نمونه شماره ۲: بهروزرسانی خطمشی جاوا اسکریپت
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و مقدار متغیر دیگریpathقرار دارد بهروزرسانی میشود، مقدار این متغیر ازrequest.header.Path.بازیابی میشوداگر به درخواست یا ردیابی واقعی دسترسی دارید، میتوانید مقدار واقعی ارسالشده به
request.header.Pathرا درستیسنجی کنید.درخواست نمونهای که کاربر انجام داده است:
curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token>
در این مثال، مسیر سرایند بهعنوان بخشی از درخواست ارسال نمیشود. بنابراین، مقدار مسیر متغیر در خطمشی جاوا اسکریپت
nullاست.بنابراین:
url = https://mocktarget.apigee.net + pathurl = https://mocktarget.apigee.net + nulltarget.url = https://mocktarget.apigee.netnull
توجه داشته باشید که
target.urlدارای اجزای زیر است:- طرح:
https://mocktarget.apigee.netnull - مسیر: خالی
نمونه شماره ۳
نمونه شماره ۳: خطمشی AssignMessage متغیر
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 - مسیر: خالی
در همه مثالهای بالا، مسیر در نشانی وب سرور زیرینه، یعنی
target.urlخالی است، بنابراین Apigee Edge500 Internal Server Errorرا با کد خطایprotocol.http.EmptyPathبرمیگرداند.- طرح:
وضوح
طبق مشخصات
RFC 3986، بخش ۲: عناصر دستور زبان، عنصر path
الزامی است و همیشه باید خط مورب (/) داشته باشد، حتی اگر
حرف دیگری بهعنوان بخشی از path وجود نداشته باشد. برای رفع این مشکل، مراحل زیر را انجام دهید:
- مطمئن شوید که نشانی وب سرور نهایی، که با متغیر جریان
target.urlنشان داده میشود، همیشه مسیر غیرخالی داشته باشد.- در برخی موارد، ممکن است نام منبع در مسیر نداشته باشید، در این صورت مطمئن شوید که مسیر
حداقل یک خط مورب (
/) داشته باشد. - اگر از متغیرهای دیگری برای تعیین مقدار متغیر جاری
target.urlاستفاده میکنید، مطمئن شوید که متغیرهای دیگر مسیر خالی نداشته باشند. - اگر هرگونه عملیات رشتهای برای تعیین مقدار متغیر جاری انجام میدهید
target.url، مطمئن شوید که نتیجه یا برونداد عملیات رشتهای مسیر خالی نداشته باشد.
- در برخی موارد، ممکن است نام منبع در مسیر نداشته باشید، در این صورت مطمئن شوید که مسیر
حداقل یک خط مورب (
- در نمونههایی که در تشخیص بحث شده است، میتوانید این مشکل را همانطور که در زیر توضیح داده شده است برطرف کنید:
نمونه شماره ۱
نمونه شماره ۱: بهروزرسانی خطمشی جاوا اسکریپت متغیر
target.urlبرای رفع این مشکل، همانطور که در زیر نشان داده شده است، یک خط مورب (
/) به متغیرurlاضافه کنید: مسئله:var url = "https://mocktarget.apigee.net/" context.setVariable("target.url", url);
نمونه شماره ۲
نمونه شماره ۲: بهروزرسانی خطمشی جاوا اسکریپت
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"
نمونه شماره ۳
نمونه شماره ۳: خطمشی AssignMessage متغیر
target.urlرا ازطریق متغیر دیگری بهروزرسانی میکندمسیر معتبری را در عنصر
<Value>خطمشی «اختصاص پیام» اضافه کنید. برای مثال، میتوانید/jsonرا بهعنوان مسیر میانای برنامهسازی کاربردی MockTarget داشته باشید. یعنی عنصر<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 انتظار دارد که نشانی وب سرور پشتیبان طبق مشخصات زیر مسیر خالی نداشته باشد:
| مشخصات |
|---|
| RFC 3986، بخش ۳: عناصر دستور زبان |
| RFC 3986، بخش ۳.۳: مسیر |
اگر هنوز به کمک «پشتیبانی Apigee» نیاز دارید، به باید اطلاعات تشخیصی را جمعآوری کنید بروید.
باید اطلاعات تشخیص خرابی را جمعآوری کند
اگر مشکل حتی پساز دنبال کردن دستورالعملهای بالا برطرف نشد، اطلاعات تشخیصی زیر را جمعآوری کنید و سپس با پشتیبانی Apigee Edge تماس بگیرید.
اگر کاربر «ابر عمومی» هستید، اطلاعات زیر را ارائه دهید:
- نام سازمان
- نام محیط
- نام پراکسی میانای برنامهسازی کاربردی
- فرمان کامل
curlبرای بازتولید500 Internal Server Errorبا کد خطایprotocol.http.EmptyPathاستفاده شد - فایل ردیابی برای درخواستهای 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