شما در حال مشاهده اسناد 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.EmptyPath
X-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.EmptyPath
X-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