आपको Apigee Edge का दस्तावेज़ दिख रहा है.
Apigee X के दस्तावेज़ पर जाएं. जानकारी
समस्या का ब्यौरा
क्लाइंट ऐप्लिकेशन को एपीआई कॉल के जवाब में, 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"
}
}
}संभावित कारण
यह गड़बड़ी तब होती है, जब बैकएंड सर्वर के अनुरोध यूआरएल में कोई पाथ नहीं होता. इस यूआरएल को फ़्लो वैरिएबल
target.url से दिखाया जाता है.
आरएफ़सी 3986, सेक्शन 3: सिंटैक्स कॉम्पोनेंट और आरएफ़सी 3986, सेक्शन 3.3: पाथ के स्पेसिफ़िकेशन के मुताबिक:
यूआरआई सिंटैक्स में ये कॉम्पोनेंट होते हैं:
foo://example.com:8042/over/there?name=ferret#nose \_/ \______________/\_________/ \_________/ \__/ | | | | | scheme authority path query fragmentpathकॉम्पोनेंट ज़रूरी है. इसमें हमेशा फ़ॉरवर्ड स्लैश (/) होना चाहिए. भले ही, पाथ में कोई दूसरा वर्ण न हो.
इसलिए, अगर बैकएंड सर्वर के अनुरोध यूआरएल में path कॉम्पोनेंट मौजूद नहीं है, यानी कि इसमें फ़ॉरवर्ड स्लैश (/) भी नहीं है, तो Apigee Edge, 500 Internal Server Error और गड़बड़ी कोड protocol.http.EmptyPath के साथ जवाब देता है.
उदाहरण के लिए: अगर target.url की वैल्यू https://www.mocktarget.apigee.net है, तो यह गड़बड़ी दिखती है. ऐसा इसलिए होता है, क्योंकि path कॉम्पोनेंट खाली है या मौजूद नहीं है.
| वजह | ब्यौरा | इनके लिए समस्या हल करने के निर्देश |
|---|---|---|
| बैकएंड सर्वर यूआरएल (target.url) में पाथ मौजूद नहीं है | फ़्लो वैरिएबल target.url से दिखाए गए बैकएंड सर्वर यूआरएल का पाथ खाली है. |
Edge Public और Private Cloud के उपयोगकर्ताओं के लिए |
गड़बड़ी का पता लगाने के सामान्य चरण
इस गड़बड़ी का पता लगाने के लिए, इनमें से किसी टूल/तकनीक का इस्तेमाल करें:
एपीआई मॉनिटरिंग
पहली प्रक्रिया: एपीआई मॉनिटरिंग का इस्तेमाल करना
एपीआई मॉनिटरिंग का इस्तेमाल करके गड़बड़ी का पता लगाने के लिए:
- Apigee Edge के यूज़र इंटरफ़ेस (यूआई) में, सही भूमिका वाले उपयोगकर्ता के तौर पर साइन इन करें.
उस संगठन पर स्विच करें जिसमें आपको समस्या की जांच करनी है.

- विश्लेषण करें > एपीआई मॉनिटरिंग > जांच करें पेज पर जाएं.
- वह समयावधि चुनें जिसमें आपको गड़बड़ियां दिखीं.
समय के हिसाब से गड़बड़ी का कोड प्लॉट करें.
नीचे दिखाए गए तरीके से, वह सेल चुनें जिसमें गड़बड़ी का कोड
protocol.http.EmptyPathमौजूद है:
गड़बड़ी कोड
protocol.http.EmptyPathके बारे में जानकारी, यहां दी गई इमेज में दिखाए गए तरीके से दिखती है:
अनुरोध पूरा न होने की वजह जानने के लिए, लॉग देखें पर क्लिक करें.
- लॉग विंडो में, यह जानकारी नोट करें:
- स्टेटस कोड:
500 - गड़बड़ी का सोर्स:
target - गड़बड़ी का कोड:
protocol.http.EmptyPath
- स्टेटस कोड:
- अगर गड़बड़ी का सोर्स
targetहै और गड़बड़ी का कोडprotocol.http.EmptyPathहै, तो इसका मतलब है कि बैकएंड सर्वर यूआरएल का पाथ खाली है.
ट्रेस
दूसरी प्रक्रिया: Trace टूल का इस्तेमाल करना
ट्रेस टूल का इस्तेमाल करके गड़बड़ी का पता लगाने के लिए:
- ट्रेस सेशन चालू करें और इनमें से कोई एक विकल्प चुनें
500 Internal Server Errorगड़बड़ी होने का इंतज़ार करें या- अगर आपको समस्या का पता चल गया है, तो समस्या को फिर से ठीक करने के लिए एपीआई कॉल करें
500 Internal Server Error
पक्का करें कि Show all FlowInfos चालू हो:
- पूरे न हो पाने वाले किसी अनुरोध को चुनें और उसके ट्रेस की जांच करें.
- ट्रेस के अलग-अलग फ़ेज़ पर जाएं और पता लगाएं कि गड़बड़ी कहां हुई.
आपको आम तौर पर, टारगेट अनुरोध का फ़्लो शुरू हुआ फ़ेज़ के बाद, फ़्लो में गड़बड़ी दिखेगी. जैसा कि यहां दिखाया गया है:
ट्रेस से गड़बड़ी की वैल्यू नोट करें.
error: Request path cannot be empty
यह गड़बड़ी, Target Request Flow Started फ़ेज़ के बाद Apigee Edge से हुई है. इसलिए, इससे पता चलता है कि बैकएंड सर्वर के यूआरएल में
pathखाली है. ऐसा तब हो सकता है, जब अनुरोध फ़्लो में मौजूद किसी नीति के ज़रिए, फ़्लो वैरिएबलtarget.url(जो बैकएंड सर्वर के यूआरएल को दिखाता है) को खाली पाथ के साथ अपडेट किया गया हो.- हर फ़्लो में, वेरिएबल पढ़े गए और असाइन किए गए सेक्शन की जांच करें. यह जांच, गड़बड़ी वाली जगह से लेकर टारगेट अनुरोध फ़्लो शुरू हुआ फ़ेज़ तक पीछे की ओर की जानी चाहिए.
वह नीति तय करें जिसमें फ़्लो वैरिएबल
target.urlअपडेट किया जाता है.JavaScript नीति की मदद से, फ़्लो वैरिएबल
target.urlको अपडेट करने वाला सैंपल ट्रेस:
ऊपर दिखाए गए सैंपल ट्रेस में, फ़्लो वैरिएबल की वैल्यू पर ध्यान दें.
target.urlको SetTargetURL नाम की JavaScript नीति में इस तरह अपडेट किया गया है:target.url : https://mocktarget.apigee.net
- ध्यान दें कि
target.urlमें ये कॉम्पोनेंट होते हैं:- स्कीम:
https://mocktarget.apigee.net - पाथ: खाली है
- स्कीम:
- इसलिए, आपको गड़बड़ी
Request path cannot be emptyका मैसेज मिलता है. - ट्रेस में AX (Analytics Data Recorded) फ़ेज़ पर जाएं और उस पर क्लिक करें.
नीचे की ओर स्क्रोल करके, फ़ेज़ की जानकारी - गड़बड़ी वाले हेडर सेक्शन पर जाएं. इसके बाद, 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 ऐक्सेस लॉग का इस्तेमाल करके गड़बड़ी का पता लगाने के लिए:
- अगर आप Private Cloud के उपयोगकर्ता हैं, तो NGINX के ऐक्सेस लॉग का इस्तेमाल करके, एचटीटीपी
500 Internal Server Errorके बारे में अहम जानकारी का पता लगाया जा सकता है. NGINX के ऐक्सेस लॉग देखें:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log- खोजें कि क्या किसी खास अवधि के दौरान, गड़बड़ी कोड
500protocol.http.EmptyPathवाली कोई गड़बड़ी हुई है (अगर समस्या पहले हुई थी) या क्या अब भी500वाली कोई गड़बड़ी हो रही है. अगर आपको X-Apigee-fault-code की वैल्यू,
protocol.http.EmptyPathकी वैल्यू से मेल खाने वाली500गड़बड़ियां मिलती हैं, तो X-Apigee-fault-source की वैल्यू का पता लगाएं.NGINX के ऐक्सेस लॉग में मौजूद 500 गड़बड़ी का उदाहरण:
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) में पाथ खाली है
संक्रमण की जांच
- एपीआई मॉनिटरिंग, Trace Tool या NGINX ऐक्सेस लॉग का इस्तेमाल करके,
500 Internal Server Errorके लिए गड़बड़ी का कोड और गड़बड़ी का सोर्स पता करें. इसके बारे में गड़बड़ी का पता लगाने के सामान्य तरीके में बताया गया है. - अगर गड़बड़ी का कोड
protocol.http.EmptyPathहै और गड़बड़ी का सोर्स की वैल्यूtargetहै, तो इसका मतलब है कि बैकएंड सर्वर यूआरएल में पाथ खाली है. Apigee Edge में, बैकएंड सर्वर के यूआरएल को फ़्लो वैरिएबल
target.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: JavaScript की नीति को अपडेट करने वाला
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,
protocol.http.EmptyPathगड़बड़ी कोड के साथ500 Internal Server Errorदिखाता है.सैंपल #2
दूसरा उदाहरण: JavaScript की नीति को अपडेट करने वाला
target.urlवैरिएबलvar path = context.getVariable("request.header.Path"); var url = "https://mocktarget.apigee.net" + path context.setVariable("target.url", url);
ऊपर दिए गए सैंपल में, ध्यान दें कि फ़्लो वैरिएबल
target.urlको अपडेट किया गया है. इसके लिए, वैरिएबलurlमें मौजूद वैल्यूhttps://mocktarget.apigee.netऔर दूसरे वैरिएबलpathकी वैल्यू को एक साथ जोड़ा गया है. इस वैरिएबल की वैल्यू,request.header.Path.से ली गई हैअगर आपके पास असली अनुरोध या ट्रेस का ऐक्सेस है, तो
request.header.Pathको पास की गई असली वैल्यू की पुष्टि की जा सकती है.उपयोगकर्ता के अनुरोध का उदाहरण:
curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token>
इस उदाहरण में, हेडर पाथ को अनुरोध के हिस्से के तौर पर नहीं भेजा जाता है. इसलिए, JavaScript नीति में वैरिएबल पाथ की वैल्यू
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 Edge, गड़बड़ी कोडprotocol.http.EmptyPathके साथ500 Internal Server Errorदिखाता है.- स्कीम:
रिज़ॉल्यूशन
आरएफ़सी 3986 के सेक्शन 2: सिंटैक्स कॉम्पोनेंट के स्पेसिफ़िकेशन के मुताबिक, path कॉम्पोनेंट ज़रूरी है. इसमें हमेशा फ़ॉरवर्ड स्लैश (/) होना चाहिए. भले ही, path के हिस्से के तौर पर कोई अन्य वर्ण न हो. इस समस्या को ठीक करने के लिए, यह तरीका अपनाएं:
- पक्का करें कि बैकएंड सर्वर यूआरएल, जिसे फ़्लो वैरिएबल
target.urlसे दिखाया जाता है, में हमेशा पाथ मौजूद हो.- कुछ मामलों में, हो सकता है कि पाथ में आपके पास संसाधन का नाम न हो. ऐसे में, पक्का करें कि पाथ में कम से कम एक फ़ॉरवर्ड स्लैश (
/) हो. - अगर फ़्लो वैरिएबल
target.urlकी वैल्यू तय करने के लिए किसी अन्य वैरिएबल का इस्तेमाल किया जाता है, तो पक्का करें कि अन्य वैरिएबल का पाथ खाली न हो. - अगर आपको फ़्लो वैरिएबल
target.urlकी वैल्यू तय करने के लिए, स्ट्रिंग ऑपरेशन करने हैं, तो पक्का करें कि स्ट्रिंग ऑपरेशन के नतीजे में कोई खाली पाथ न हो.
- कुछ मामलों में, हो सकता है कि पाथ में आपके पास संसाधन का नाम न हो. ऐसे में, पक्का करें कि पाथ में कम से कम एक फ़ॉरवर्ड स्लैश (
- निदान में बताए गए सैंपल में, इस समस्या को ठीक करने के लिए यहां दिया गया तरीका अपनाएं:
पहला सैंपल
उदाहरण #1: JavaScript की नीति को अपडेट करने वाला
target.urlवैरिएबलइस समस्या को ठीक करने के लिए,
urlवैरिएबल में फ़ॉरवर्ड स्लैश (/) जोड़ें. ऐसा नीचे दिए गए तरीके से करें:var url = "https://mocktarget.apigee.net/" context.setVariable("target.url", url);
सैंपल #2
दूसरा उदाहरण: JavaScript की नीति को अपडेट करने वाला
target.urlवैरिएबलvar path = context.getVariable("request.header.Path"); var url = "https://mocktarget.apigee.net" + path context.setVariable("target.url", url);
यह पक्का करें कि आपने मान्य पाथ पास किया हो. उदाहरण के लिए, यहां दिखाई गई समस्या को ठीक करने के लिए, अनुरोध का हेडर
Pathके हिस्से के तौर पर/iloveapis:अनुरोध का उदाहरण:
curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token> -H "Path: /iloveapis"
तीसरा सैंपल
तीसरा सैंपल: AssignMessage नीति, दूसरे वैरिएबल के ज़रिए
target.urlवैरिएबल को अपडेट कर रही हैAssignMessage नीति के
<Value>एलिमेंट में कोई मान्य पाथ जोड़ें. उदाहरण के लिए, MockTarget API के लिए/jsonको पाथ के तौर पर इस्तेमाल किया जा सकता है. इसका मतलब है कि<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 को उम्मीद है कि बैकएंड सर्वर के यूआरएल में, यहां दी गई खास शर्तों के मुताबिक पाथ खाली नहीं है:
| खास जानकारी |
|---|
| आरएफ़सी 3986, सेक्शन 3: सिंटैक्स कॉम्पोनेंट |
| आरएफ़सी 3986, सेक्शन 3.3: पाथ |
अगर आपको अब भी Apigee की सहायता टीम से मदद चाहिए, तो गड़बड़ी की जानकारी इकट्ठा करना ज़रूरी है पर जाएं.
गड़बड़ी की जानकारी इकट्ठा करना ज़रूरी है
अगर ऊपर दिए गए निर्देशों का पालन करने के बाद भी समस्या बनी रहती है, तो डाइग्नोस्टिक की यह जानकारी इकट्ठा करें. इसके बाद, Apigee Edge की सहायता टीम से संपर्क करें.
अगर आप पब्लिक क्लाउड के उपयोगकर्ता हैं, तो यह जानकारी दें:
- संगठन का नाम
- परिवेश का नाम
- एपीआई प्रॉक्सी का नाम
curlकमांड का इस्तेमाल करके, गड़बड़ी के कोडprotocol.http.EmptyPathके साथ500 Internal Server Errorको फिर से बनाया गया- एपीआई अनुरोधों के लिए ट्रेस फ़ाइल
अगर आप 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