شما در حال مشاهده مستندات 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"
}
}
}علل احتمالی
این خطا زمانی رخ میدهد که آدرس اینترنتی (URL) درخواستی سرور backend، که با متغیر جریان 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الزامی است و باید همیشه یک اسلش (/) داشته باشد، حتی اگر هیچ کاراکتر دیگری به عنوان بخشی از مسیر وجود نداشته باشد.
بنابراین، اگر آدرس اینترنتی درخواست سرور backend اصلاً مؤلفه path را نداشته باشد، یعنی حتی یک اسلش ( / ) هم نداشته باشد، Apigee Edge با 500 Internal Server Error و error code protocol.http.EmptyPath پاسخ میدهد.
برای مثال: اگر target.url مقدار https://www.mocktarget.apigee.net را داشته باشد، این خطا به عنوان path رخ میدهد. path جزء خالی یا مفقود است.
| علت | توضیحات | دستورالعملهای عیبیابی قابل اجرا برای |
|---|---|---|
| آدرس اینترنتی سرور بکاند (target.url) مسیر خالی دارد | آدرس اینترنتی سرور Backend که توسط متغیر جریان target.url نمایش داده میشود، یک مسیر خالی دارد. | کاربران فضای ابری عمومی و خصوصی Edge |
مراحل تشخیص مشترک
برای تشخیص این خطا از یکی از ابزارها/تکنیکهای زیر استفاده کنید:
نظارت بر API
روش شماره ۱: استفاده از مانیتورینگ API
برای تشخیص خطا با استفاده از مانیتورینگ API:
- به عنوان کاربری با نقش کاربری مناسب، وارد رابط کاربری Apigee Edge شوید .
به سازمانی که میخواهید مشکل را در آن بررسی کنید، مراجعه کنید.

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

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

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

مقدار خطا را از ردیابی یادداشت کنید.
خطا: مسیر درخواست نمیتواند خالی باشد
از آنجایی که این خطا توسط Apigee Edge پس از مرحلهی «شروع جریان درخواست هدف» رخ میدهد، نشان میدهد که
pathدر URL سرور backend خالی است. این احتمالاً زمانی اتفاق میافتد که متغیر جریانtarget.url(که نشاندهندهی URL سرور backend است) از طریق یکی از سیاستهای موجود در جریان درخواست با یک مسیر خالی بهروزرسانی شده باشد.- بخشهای «متغیرهای خوانده شده» و «متغیرهای اختصاص داده شده» را در هر یک از جریانها از نقطه خطا به سمت مرحله «جریان درخواست هدف آغاز شده» به صورت معکوس بررسی کنید.
سیاستی را تعیین کنید که در آن متغیر جریان
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 (دادههای تحلیلی ثبتشده) بروید و روی آن کلیک کنید.
به پایین صفحه بروید تا به بخش جزئیات فاز - سرصفحههای خطا برسید و مقادیر X-Apigee-fault-code و X-Apigee-fault-source را مطابق شکل زیر تعیین کنید:

- مقادیر X-Apigee-fault-code و X-Apigee-fault-source را به صورت
protocol.http.EmptyPathوtargetمشاهده خواهید کرد.targetبه ترتیب، نشان میدهد که این خطا به دلیل وجود مسیر خالی در آدرس اینترنتی سرور backend ایجاد شده است.هدرهای پاسخ ارزش کد خطای X-Apigee protocol.http.EmptyPathمنبع گسل X-Apigee target
انجینکس
روش شماره ۳: استفاده از گزارشهای دسترسی 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وجود دارد یا خیر، یا اینکه آیا درخواستهایی با500همچنان با شکست مواجه میشوند. اگر هرگونه خطای
500با کد خطای X-Apigee-fault-code که با مقدارprotocol.http.EmptyPathمطابقت دارد، پیدا کردید، مقدار منبع خطای X-Apigee-fault را تعیین کنید.نمونه خطای ۵۰۰ از لاگ دسترسی NGINX:

ورودی نمونه بالا از لاگ دسترسی NGINX دارای مقادیر زیر برای X-Apigee-fault-code و X-Apigee-fault-source است:
سربرگها ارزش کد خطای X-Apigee protocol.http.EmptyPathمنبع گسل X-Apigee targetتوجه داشته باشید که مقادیر X-Apigee-fault-code و X-Apigee-fault-source به ترتیب
protocol.http.EmptyPathوtargetهستند.targetبه ترتیب، نشان میدهد که این خطا به دلیل وجود یک مسیر خالی در آدرس اینترنتی سرور backend ایجاد شده است.
علت: آدرس اینترنتی سرور بکاند (target.url) مسیر خالی دارد
تشخیص
- کد خطا و منبع خطا را برای
500 Internal Server Errorبا استفاده از API Monitoring، Trace Tool یا گزارشهای دسترسی NGINX همانطور که در مراحل تشخیص مشترک توضیح داده شده است، تعیین کنید. - اگر کد خطا
protocol.http.EmptyPathباشد و Fault Source مقدارtargetداشته باشد، این نشان میدهد که URL سرور backend دارای یک مسیر خالی است. آدرس اینترنتی سرور backend توسط متغیر جریان
target.urlدر Apigee Edge نمایش داده میشود. این خطا معمولاً زمانی رخ میدهد که سعی کنید آدرس اینترنتی سرور backend، یعنیtarget.urlرا به صورت پویا با استفاده از هر یک از سیاستهای (درون Proxy/shared flow) در جریان درخواست Target بهروزرسانی کنید، به طوری که یک مسیر خالی داشته باشد.- با استفاده از یکی از مراحل زیر، مشخص کنید که آیا متغیر جریان
target.urlواقعاً مسیر خالی و منبع مقدار آن را دارد یا خیر:ردیابی
استفاده از ابزار ردیابی
اگر برای این خطا ردیابی انجام دادهاید، از مراحل توضیح داده شده در استفاده از ابزار ردیابی استفاده کنید و:
- بررسی کنید که آیا
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 یا JavaScript) که متغیر جریان
target.urlتغییر یا بهروزرسانی میکند، با دقت بررسی کنید و علت بهروزرسانیtarget.urlبه یک مسیر خالی را مشخص کنید.در اینجا چند نمونه از سیاستهایی که متغیر جریان
target.urlبه اشتباه بهروزرسانی میکنند تا حاوی یک مسیر خالی باشد که منجر به این خطا میشود، آورده شده است.نمونه شماره ۱
نمونه شماره ۱: بهروزرسانی متغیر
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برمیگرداند.نمونه شماره ۲
نمونه شماره ۲: بهروزرسانی متغیر
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>
در این مثال، مسیر هدر به عنوان بخشی از درخواست ارسال نمیشود. بنابراین، مقدار متغیر path در سیاست جاوا اسکریپت
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 - مسیر: خالی
نمونه شماره ۳
نمونه شماره ۳: سیاست 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 - مسیر: خالی
در تمام مثالهای بالا، مسیر موجود در URL سرور backend، یعنی
target.url، خالی است، بنابراین Apigee Edge500 Internal Server Errorبا کد خطاprotocol.http.EmptyPathبرمیگرداند.- طرح:
وضوح تصویر
طبق مشخصات RFC 3986، بخش 2: اجزای نحوی ، جزء path الزامی است و باید همیشه یک اسلش (/) داشته باشد، حتی اگر هیچ کاراکتر دیگری به عنوان بخشی از path وجود نداشته باشد. برای رفع این مشکل مراحل زیر را انجام دهید:
- مطمئن شوید که آدرس اینترنتی سرور backend، که توسط متغیر جریان
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>از سیاست 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 سرور backend طبق مشخصات زیر مسیر خالی نداشته باشد :
| مشخصات |
|---|
| RFC 3986، بخش 3: اجزای نحوی |
| RFC 3986، بخش ۳.۳: مسیر |
اگر هنوز به هرگونه کمکی از پشتیبانی Apigee نیاز دارید، به بخش «باید اطلاعات تشخیصی را جمعآوری کنید» بروید.
باید اطلاعات تشخیصی جمعآوری کند
اگر مشکل حتی پس از پیروی از دستورالعملهای بالا ادامه داشت، اطلاعات تشخیصی زیر را جمعآوری کنید و سپس با پشتیبانی Apigee Edge تماس بگیرید.
اگر کاربر فضای ابری عمومی هستید، اطلاعات زیر را ارائه دهید:
- نام سازمان
- نام محیط
- نام پروکسی API
- دستور
curlکامل که برای تولید مجدد500 Internal Server Errorبا کد خطاprotocol.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