Sie sehen die Dokumentation zu Apigee Edge.
Zur Apigee X-Dokumentation weitere Informationen
Symptom
Die Clientanwendung erhält als Antwort auf API-Aufrufe den HTTP-Statuscode 500 Internal Server Error
mit dem Fehlercode protocol.http.EmptyPath
.
Fehlermeldung
Die Clientanwendung ruft den folgenden Antwortcode ab:
HTTP/1.1 500 Internal Server Error
Außerdem wird möglicherweise die folgende Fehlermeldung angezeigt:
{ "fault":{ "faultstring":"Request path cannot be empty", "detail":{ "errorcode":"protocol.http.EmptyPath" } } }
Mögliche Ursachen
Dieser Fehler tritt auf, wenn die Anfrage-URL des Back-End-Servers, dargestellt durch die Flussvariable
target.url
, einen leeren Pfad enthält.
Gemäß den Spezifikationen RFC 3986, Abschnitt 3: Syntaxkomponenten und RFC 3986, Abschnitt 3.3: Pfad:
Die URI-Syntax besteht aus folgenden Komponenten:
foo://example.com:8042/over/there?name=ferret#nose \_/ \______________/\_________/ \_________/ \__/ | | | | | scheme authority path query fragment
- Die Komponente
path
ist erforderlich und MUSS immer einen Schrägstrich (/
) enthalten, auch wenn der Pfad keine weiteren Zeichen enthält.
Wenn die Anfrage-URL des Back-End-Servers also überhaupt nicht die Komponente path
enthält, also keinen Schrägstrich (/
) enthält, antwortet Apigee Edge mit 500 Internal Server Error
und dem Fehlercode protocol.http.EmptyPath
.
Beispiel: Wenn target.url
den Wert https://www.mocktarget.apigee.net
hat, tritt dieser Fehler auf, da die Komponente path
leer ist oder fehlt.
Ursache | Beschreibung | Anleitungen zur Fehlerbehebung gelten für |
---|---|---|
Back-End-Server-URL (target.url) hat einen leeren Pfad | Die Back-End-Server-URL, die durch die Flussvariable target.url dargestellt wird, hat einen leeren Pfad. |
Nutzer von Edge Public und Private Cloud |
Allgemeine Diagnoseschritte
Verwenden Sie eines der folgenden Tools oder Methoden, um diesen Fehler zu diagnostizieren:
API-Monitoring
Prozedur 1: API-Monitoring verwenden
So diagnostizieren Sie den Fehler mithilfe von API-Monitoring:
- Melden Sie sich in der Apigee Edge-UI als Nutzer mit einer entsprechenden Rolle an.
Wechseln Sie zu der Organisation, in der Sie das Problem untersuchen möchten.
- Rufen Sie die Seite Analysieren > API-Überwachung > Untersuchen auf.
- Wählen Sie den Zeitraum aus, in dem Sie die Fehler beobachtet haben.
Stellen Sie den Fehlercode der Zeit gegenüber.
Wählen Sie eine Zelle mit dem Fehlercode
protocol.http.EmptyPath
aus, wie unten dargestellt:Informationen zum Fehlercode
protocol.http.EmptyPath
werden wie unten dargestellt angezeigt:Klicken Sie auf Logs ansehen , um die Zeile für die fehlgeschlagene Anfrage zu maximieren.
- Notieren Sie sich im Fenster Logs die folgenden Details:
- Statuscode:
500
- Fehlerquelle:
target
- Fehlercode:
protocol.http.EmptyPath
- Statuscode:
- Wenn die Fehlerquelle
target
und der Fehlercodeprotocol.http.EmptyPath
ist, bedeutet das, dass der Pfad der Back-End-Server-URL leer ist.
Trace
Verfahren 2: Trace-Tool verwenden
So diagnostizieren Sie den Fehler mit dem Trace-Tool:
- Aktivieren Sie die Trace-Sitzung und entweder
- Warten Sie, bis der Fehler
500 Internal Server Error
auftritt, oder - Wenn Sie das Problem reproduzieren können, führen Sie den API-Aufruf aus, um das Problem zu reproduzieren.
500 Internal Server Error
- Warten Sie, bis der Fehler
Achten Sie darauf, dass Show all FlowInfos aktiviert ist:
- Wählen Sie eine der fehlgeschlagenen Anfragen aus und prüfen Sie den Trace.
- Gehen Sie die verschiedenen Phasen des Trace durch und ermitteln Sie, wo der Fehler aufgetreten ist.
Der Fehler tritt normalerweise in einem Ablauf nach der Phase Zielanfragefluss gestartet auf, wie unten dargestellt:
Notieren Sie sich den Wert des Fehlers aus dem Trace.
Fehler: Anfragepfad darf nicht leer sein
Da der Fehler von Apigee Edge nach der Phase Zielanfragefluss gestartet ausgelöst wird, weist dies darauf hin, dass
path
in der Back-End-Server-URL leer ist. Dies tritt am wahrscheinlichsten auf, wenn die Flussvariabletarget.url
(die die URL für den Back-End-Server darstellt) möglicherweise mit einem leeren Pfad durch eine der Richtlinien im Anfrageablauf aktualisiert wurde.- Sehen Sie sich den Abschnitt Gelesene und zugewiesene Variablen in jedem der Abläufe an, die vom Fehlerpunkt bis zur Phase Zielanfragefluss gestartet zurückgeht.
Bestimmen Sie die Richtlinie, in der die Flussvariable
target.url
aktualisiert wird.Beispiel-Trace, aus dem hervorgeht, dass die JavaScript-Richtlinie die Flussvariable
target.url
aktualisiert hat:Beachten Sie im oben gezeigten Beispiel-Trace, dass der Wert der Flussvariablenvariablen
target.url
in einer JavaScript-Richtlinie namens SetTargetURL so aktualisiert wird:target.url : https://mocktarget.apigee.net
- Beachten Sie, dass
target.url
die folgenden Komponenten hat:- Schema:
https://mocktarget.apigee.net
- path:leer
- Schema:
- Daher wird der Fehler
Request path cannot be empty
angezeigt. - Gehen Sie im Trace zur Phase AX (Analytics Data Recorded) und klicken Sie darauf.
Scrollen Sie nach unten zum Abschnitt Phase Details – Error Headers (Phasendetails – Fehlerheader) und ermitteln Sie die Werte von X-Apigee-Fehler-Code und X-Apigee-Fehler-Quelle, wie unten dargestellt:
- Sie sehen die Werte von X-Apigee-fault-code und X-Apigee-fault-code als
protocol.http.EmptyPath
bzw.target
. Dies weist darauf hin, dass dieser Fehler verursacht wird, weil die Back-End-Server-URL einen leeren Pfad hat.Antwortheader Wert X-Apigee-fault-code protocol.http.EmptyPath
X-Apigee-fault-source target
NGINX
Verfahren 3: NGINX-Zugriffslogs verwenden
So diagnostizieren Sie den Fehler mithilfe von NGINX-Zugriffslogs:
- Wenn Sie ein Private Cloud-Nutzer sind, können Sie mithilfe von NGINX-Zugriffslogs die wichtigsten Informationen zu HTTP-
500 Internal Server Error
ermitteln. Prüfen Sie die NGINX-Zugriffslogs:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
- Suchen Sie nach
500
-Fehlern mit dem Fehlercodeprotocol.http.EmptyPath
während eines bestimmten Zeitraums (falls das Problem in der Vergangenheit aufgetreten ist) oder ob Anfragen immer noch mit500
fehlschlagen. Wenn Sie
500
-Fehler mit dem X-Apigee-fault-code finden, der mit dem Wert von X-Apigee-fault-code übereinstimmt, bestimmen Sie den Wert von X-Apigee-fault-code .Beispiel für einen 500-Fehler aus dem NGINX-Zugriffslog:
Der obige Beispieleintrag aus dem NGINX-Zugriffslog enthält die folgenden Werte für X- Apigee-Fehler-Code und X-Apigee-Fehler-Quelle:
Header Wert X-Apigee-fault-code protocol.http.EmptyPath
X-Apigee-fault-source target
Die Werte von X-Apigee-fault-code und X-Apigee-fault-code sind
protocol.http.EmptyPath
bzw.target
. Dies deutet darauf hin, dass dieser Fehler verursacht wird, weil die Back-End-Server-URL einen X-Apigee-fault-code hat.
Ursache: Back-End-Server-URL (target.url) hat einen leeren Pfad
Diagnose
- Bestimmen Sie den Fehlercode und die Fehlerquelle für
500 Internal Server Error
mithilfe von API-Monitoring, Trace-Tool oder NGINX-Zugriffslogs, wie unter Allgemeine Diagnoseschritte erläutert. - Wenn der Fehlercode
protocol.http.EmptyPath
lautet und die Fehlerquelle den Werttarget
hat, bedeutet dies, dass die Back-End-Server-URL einen leeren Pfad hat. Die Back-End-Server-URL wird durch die Flussvariable
target.url
in Apigee Edge dargestellt. Dieser Fehler tritt in der Regel auf, wenn Sie versuchen, die Back-End-Server-URL, alsotarget.url
, dynamisch mithilfe einer der Richtlinien (im Proxy/freigegebenen Ablauf) im Zielanfrageablauf zu aktualisieren, sodass ein leerer Pfad vorhanden ist.- Führen Sie einen der folgenden Schritte aus, um festzustellen, ob die Flussvariable
target.url
tatsächlich einen leeren Pfad und die Quelle für ihren Wert hat:Trace
Trace-Tool verwenden
Wenn Sie für diesen Fehler ein Trace erfasst haben, führen Sie die unter Trace-Tool verwenden beschriebenen Schritte aus und gehen Sie so vor:
- Prüfen Sie, ob der Pfad für
target.url
leer ist. Wenn ja, finden Sie heraus, welche Richtlinie den Wert von
target.url
so geändert oder aktualisiert hat, dass er einen leeren Pfad enthält.Beispiel-Trace, aus dem hervorgeht, dass die JavaScript-Richtlinie die Flussvariable
target.url:
aktualisiert hat- Beachten Sie im obigen Beispiel-Trace, dass der Wert von
target.url
durch die JavaScript-Richtlinie so geändert oder aktualisiert wurde, dass er einen leeren Pfad enthält. target.url
enthält die folgenden Komponenten:- Schema:
https://mocktarget.apigee.net
- path:leer
- Schema:
Logs
Logs auf dem Logserver verwenden
- Wenn Sie kein Trace für diesen Fehler haben (ein vorübergehendes Problem), prüfen Sie, ob Sie die Informationen zum Wert der Flussvariablen
target.url
mithilfe von Richtlinien wie MessageLogging oder ServiceCallout auf Ihrem Logserver protokolliert haben. - Wenn Sie die Logs haben, prüfen Sie sie und gehen Sie so vor:
- Prüfen Sie, ob der Pfad für
target.url
leer ist. - Prüfen Sie, ob Sie feststellen können, welche Richtlinie
target.url
so geändert hat, dass sie einen leeren Pfad enthält
- Prüfen Sie, ob der Pfad für
API-Proxy
Fehlerhaften API-Proxy prüfen
Wenn Sie kein Trace oder keine Logs für diesen Fehler haben, prüfen Sie den ausgefallenen API-Proxy, um festzustellen, wodurch die Flussvariable
target.url
so geändert oder aktualisiert wurde, dass sie einen ungültigen Pfad enthält. Folgende Voraussetzungen müssen erfüllt sein:- Die Richtlinie im API-Proxy
- Alle vom Proxy aufgerufenen freigegebenen Abläufe
- Prüfen Sie, ob der Pfad für
Sehen Sie sich die Richtlinie (z. B. „AssignMessage“ oder „JavaScript“) an, mit der die Flussvariable
target.url
geändert oder aktualisiert wird, und ermitteln Sie die Ursache für das Aktualisieren vontarget.url
mit einem leeren Pfad.Im Folgenden finden Sie einige Beispielrichtlinien, die die Flussvariable
target.url
fälschlicherweise so aktualisieren, dass sie einen leeren Pfad enthält, der zu diesem Fehler führt.Beispiel 1
Beispiel 1: JavaScript-Richtlinie aktualisiert die Variable
target.url
var url = "https://mocktarget.apigee.net" context.setVariable("target.url", url);
Beachten Sie im obigen Beispiel, dass die Flussvariable
target.url
mit dem Werthttps://mocktarget.apigee.net
aktualisiert wird, der in einer anderen Variablenurl
enthalten ist.Beachten Sie, dass
target.url
die folgenden Komponenten enthält:- Schema:
https://mocktarget.apigee.net
- path:leer
Da der Pfad leer ist, gibt Apigee Edge
500 Internal Server Error
mit dem Fehlercodeprotocol.http.EmptyPath
zurück.Beispiel 2
Beispiel 2: JavaScript-Richtlinie aktualisiert die Variable
target.url
var path = context.getVariable("request.header.Path"); var url = "https://mocktarget.apigee.net" + path context.setVariable("target.url", url);
Beachten Sie im obigen Beispiel, dass die Flussvariable
target.url
durch Verkettung des Wertshttps://mocktarget.apigee.net
, der in einer Variablenurl
enthalten ist, und dem Wert einer anderen Variablenpath
, deren Wert ausrequest.header.Path.
abgerufen wird, aktualisiert wird.Wenn Sie Zugriff auf die tatsächliche Anfrage oder den tatsächlichen Trace haben, können Sie den tatsächlichen Wert prüfen, der an
request.header.Path
übergeben wurde.Beispielanfrage des Nutzers:
curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token>
In diesem Beispiel wird der Header-Pfad nicht als Teil der Anfrage gesendet. Daher lautet der Wert des Variablenpfads in der JavaScript-Richtlinie
null
.Das bedeutet:
url = https://mocktarget.apigee.net + path
url = https://mocktarget.apigee.net + null
target.url = https://mocktarget.apigee.netnull
Beachten Sie, dass
target.url
die folgenden Komponenten enthält:- Schema:
https://mocktarget.apigee.netnull
- path:leer
Beispiel 3
Beispiel 3: Zuweisungsmeldungsrichtlinie zum Aktualisieren der Variable
target.url
über eine andere Variable<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>
Beachten Sie, dass
target.url
die folgenden Komponenten enthält:- Schema:
https://mocktarget.apigee.net
- path:leer
In allen obigen Beispielen ist der Pfad in der Back-End-Server-URL, d. h.
target.url
, leer. Daher gibt Apigee Edge500 Internal Server Error
mit dem Fehlercodeprotocol.http.EmptyPath
zurück.- Schema:
Auflösung
Gemäß der Spezifikation
RFC 3986, Abschnitt 2: Syntaxkomponenten ist die path
-Komponente erforderlich und MUSS immer einen Schrägstrich (/) enthalten, auch wenn keine anderen Zeichen in path
enthalten sind. Führe die folgenden Schritte aus, um dieses Problem zu beheben:
- Achten Sie darauf, dass die Back-End-Server-URL, die durch die Flussvariable
target.url
dargestellt wird, immer einen nicht leeren Pfad hat.- Wenn der Pfad in einigen Fällen keinen Ressourcennamen enthält, muss im Pfad mindestens ein Schrägstrich (
/
) enthalten sein. - Wenn Sie andere Variablen verwenden, um den Wert der Flussvariablen
target.url
zu bestimmen, dürfen die anderen Variablen keinen leeren Pfad haben. - Wenn Sie Stringvorgänge ausführen, um den Wert der Flussvariablen
target.url
zu ermitteln, darf das Ergebnis oder Ergebnis der Stringvorgänge nicht leer sein.
- Wenn der Pfad in einigen Fällen keinen Ressourcennamen enthält, muss im Pfad mindestens ein Schrägstrich (
- In den Beispielen, die im Abschnitt Diagnose erläutert werden, können Sie dieses Problem wie unten erläutert beheben:
Beispiel 1
Beispiel 1: JavaScript-Richtlinie aktualisiert die Variable
target.url
Fügen Sie der Variablen
url
einen Schrägstrich (/
) hinzu, um dieses Problem wie unten dargestellt zu beheben:var url = "https://mocktarget.apigee.net/" context.setVariable("target.url", url);
Beispiel 2
Beispiel 2: JavaScript-Richtlinie aktualisiert die Variable
target.url
var path = context.getVariable("request.header.Path"); var url = "https://mocktarget.apigee.net" + path context.setVariable("target.url", url);
Sie müssen einen gültigen Pfad wie
/iloveapis
als Teil des AnfrageheadersPath
übergeben, um dieses Problem wie unten dargestellt zu beheben:Beispielanfrage:
curl -v https://HOST_ALIAS/v1/myproxy -H "Authorization: Bearer <token> -H "Path: /iloveapis"
Beispiel 3
Beispiel 3: AttributionMessage-Richtlinie aktualisiert die Variable
target.url
über eine andere VariableFügen Sie im Element
<Value>
der Richtlinie „AssignMessage“ einen gültigen Pfad hinzu. Sie können beispielsweise/json
als Pfad für die MockTarget API verwenden. Ändern Sie also das Element<Value>
wie unten gezeigt zuhttps://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>
Spezifikation
Apigee Edge erwartet, dass die Back-End-Server-URL gemäß den folgenden Spezifikationen keinen leeren Pfad hat:
Spezifikation |
---|
RFC 3986, Abschnitt 3: Syntaxkomponenten |
RFC 3986, Abschnitt 3.3: Pfad |
Wenn Sie weiterhin Unterstützung vom Apigee-Support benötigen, lesen Sie Diagnoseinformationen müssen erfasst werden.
Diagnoseinformationen müssen erfasst werden
Wenn das Problem auch nach Befolgen der obigen Anleitung weiterhin besteht, stellen Sie die folgenden Diagnoseinformationen zusammen und wenden Sie sich an den Apigee Edge-Support.
Wenn Sie ein Public Cloud-Nutzer sind, geben Sie die folgenden Informationen an:
- Name der Organisation
- Name der Umgebung
- API-Proxy-Name
- Führen Sie den Befehl
curl
aus, der zum Reproduzieren von500 Internal Server Error
mit dem Fehlercodeprotocol.http.EmptyPath
verwendet wurde. - Ablaufverfolgungsdatei für die API-Anfragen
Wenn Sie ein Private Cloud-Nutzer sind, geben Sie die folgenden Informationen an:
- Vollständige Fehlermeldung bei fehlgeschlagenen Anfragen
- Name der Umgebung
- API-Proxy-Bundle
- Ablaufverfolgungsdatei für die API-Anfragen
NGINX-Zugriffslogs:
/opt/apigee/var/log/edge-router/nginx/ORG~ENV.PORT#_access_log
Hierbei gilt: ORG, ENV und PORT# werden durch tatsächliche Werte ersetzt.
- Systemprotokolle von Message Processor
/opt/apigee/var/log/edge-message- processor/logs/system.log